Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

DiogoMiguel

HMAC-SHA1

Mensagens Recomendadas

DiogoMiguel    0
DiogoMiguel

Boas pessoal,

Eu estou a fazer um trabalho que consiste em fazer o HMAC-SHA1.

O resultado que me der, tem de ser igual ao dado pelo seguinte comando openssl:

openssl dgst -sha1 -hmac key filename.file

Eu tenho o seguinte código feito:

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
*
* @author Diogo
*/
public class HMAC_MANUAL {

private static MessageDigest md;
private static byte[] XorKeyIpad, XorKeyOpad;

private static final byte ipad = 0x36;
private static final byte opad = 0x5c;
private static final byte maxsize = 64;

public static void HMAC_SHA1(String msg, String keyString) throws NoSuchAlgorithmException, UnsupportedEncodingException {

	int i;
	msg = "value";
	keyString = "ccbbaa";
	String keyHex = toHex(keyString);
	byte[] keyByte = keyHex.getBytes("UTF-8");
	md = MessageDigest.getInstance("SHA-1");
	/*System.out.println("keyHex: " + keyHex);
	System.out.println("keyByte: " + keyByte);
	System.out.println("ipad: " + ipad);*/

	//Verify if the Key have the right size;
	if (keyByte.length > maxsize) {
		keyByte = md.digest(keyByte);
		md.reset();
	}
	/*System.out.println("KeyByte: " + keyByte + " Length: " + keyByte.length);*/

	//XOR between Key and ipad;
	XorKeyIpad = new byte[maxsize];
	for (i = 0; i < keyByte.length; i++) {
		XorKeyIpad[i] = (byte) (keyByte[i] ^ ipad);
	}
	/*System.out.println("XorKeyIpad: " + XorKeyIpad + "  Ipad: " + ipad);*/		


	//Concat the XOR between Key and ipad with the message;
	String concatXorKIM = concatByteString(XorKeyIpad, msg);
	//System.out.println("concatXorKIM: " + concatXorKIM);

	//SHA1 of the concat the XOR between Key and ipad with the message(which i call X);
	md.update(concatXorKIM.getBytes("UTF-8"));
	byte[] hashConcatXorKIM = md.digest();
	md.reset();
	//System.out.println("hashConcatXorKIM: " + hashConcatXorKIM);

	//XOR between Key and opad(which i call Y);
	XorKeyOpad = new byte[maxsize];
	for (i = 0; i < keyByte.length; i++) {
		XorKeyOpad[i] = (byte) (keyByte[i] ^ opad);
	}

	//Concat between X and Y;
	byte[] concatHashXorKI_XorKO = concatByteByte(hashConcatXorKIM, XorKeyOpad);
	//System.out.println("concatHashXorKI_XorKO: " + concatHashXorKI_XorKO);

	//SHA1 of the variable concatHashXorKI_XorKO
	md.update(concatHashXorKI_XorKO);
	byte[] hmac = md.digest();
	md.reset();

	System.out.println(bytesToHex(hmac));

	/*for (; i < maxsize; i++) {
	 XorKeyIpad[i] = ipad;
	 XorKeyOpad[i] = opad;
	 }
	 md.update(ipad);*/
}

public static String toHex(String arg) throws UnsupportedEncodingException {
	return String.format("%040x", new BigInteger(1, arg.getBytes("UTF-8")));
}

public static String concatByteString(final byte[] bytes, final String str) {
	final StringBuilder sb = new StringBuilder();
	for (byte b : bytes) {
		sb.append(b);
	}
	sb.append(str);
	return sb.toString();
}

public static byte[] concatByteByte(final byte[] byteOne, final byte[] byteTwo) {
	byte[] concatBytes = new byte[byteOne.length + byteTwo.length];
	System.arraycopy(byteOne, 0, concatBytes, 0, byteOne.length);
	System.arraycopy(byteTwo, 0, concatBytes, byteOne.length, byteTwo.length);

	return concatBytes;
}

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();

public static String bytesToHex(byte[] bytes) {
	char[] hexChars = new char[bytes.length * 2];
	int v;
	for (int j = 0; j < bytes.length; j++) {
		v = bytes[j] & 0xFF;
		hexChars[j * 2] = hexArray[v >>> 4];
		hexChars[j * 2 + 1] = hexArray[v & 0x0F];
	}
	return new String(hexChars);
}

Eu sei que estou perto do resultado final, mas os resultados que encontro ainda não são iguais ao do tal comando openssl, o que significa que ainda estou a fazer alguma coisa mal.

Alguém me consegue ajudar?

Com os melhores cumprimentos,

Diogo Miguel

Editado por Baderous
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.