online hmacsha256 decrypt java character-encoding digital-signature hmac

java - hmacsha256 - Algoritmo HMAC-SHA256 para cálculo de firma



hmac sha256 online (7)

Estoy intentando crear una firma usando el algoritmo HMAC-SHA256 y este es mi código. Estoy usando la codificación ASCII de EE. UU.

final Charset asciiCs = Charset.forName("US-ASCII"); final Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); final SecretKeySpec secret_key = new javax.crypto.spec.SecretKeySpec(asciiCs.encode("key").array(), "HmacSHA256"); final byte[] mac_data = sha256_HMAC.doFinal(asciiCs.encode("The quick brown fox jumps over the lazy dog").array()); String result = ""; for (final byte element : mac_data) { result += Integer.toString((element & 0xff) + 0x100, 16).substring(1); } System.out.println("Result:[" + result + "]");

El resultado que obtengo del código anterior es:

f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

Este es el mismo que el mostrado en la wiki

HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = 0x f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

excepto por el 0x .

Estoy buscando ideas / comentarios si estoy haciendo todo bien o puedo mejorar mi código.


El 0x solo denota que los personajes después de él representan una cadena hexagonal.

0x1A == 1Ah == 26 == 1A

Entonces, el 0x es solo para aclarar en qué formato está la salida, sin necesidad de preocuparse por ello.


La respuesta que obtuviste es correcta. Una cosa menor en el código anterior, necesita iniciar (clave) antes de poder llamar a doFinal ()

final Charset charSet = Charset.forName("US-ASCII"); final Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); final SecretKeySpec secret_key = new javax.crypto.spec.SecretKeySpec(charSet.encode("key").array(), "HmacSHA256"); try { sha256_HMAC.init(secret_key); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } ...


Aquí está mi solución:

public static String encode(String key, String data) throws Exception { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8"))); } public static void main(String [] args) throws Exception { System.out.println(encode("key", "The quick brown fox jumps over the lazy dog")); }

O puede devolver el hash codificado en Base64:

Base64.encodeBase64String(sha256_HMAC.doFinal(data.getBytes("UTF-8")));

La salida en hex es lo esperado:

f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8


Aquí está mi solución:

public String HMAC_SHA256(String secret, String message) { String hash=""; try{ Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); sha256_HMAC.init(secret_key); hash = Base64.encodeToString(sha256_HMAC.doFinal(message.getBytes()), Base64.DEFAULT); }catch (Exception e) { } return hash.trim(); }


Esto está funcionando bien para mí

Tengo dependencia de agregar

compile ''commons-codec:commons-codec:1.9''

ref: http://mvnrepository.com/artifact/commons-codec/commons-codec/1.9

mi función

public String encode(String key, String data) { try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); return new String(Hex.encodeHex(sha256_HMAC.doFinal(data.getBytes("UTF-8")))); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }


Si existe la posibilidad de que encuentre una solución sobre cómo calcular HMAC-SHA256 aquí, pero obtendrá una excepción como esta:

java.lang.NoSuchMethodError: ningún método estático encodeHexString ([B) Ljava / lang / String; en la clase Lorg / Apache / commons / codec / binary / Hex; o sus superclases (la declaración de ''org.apache.commons.codec.binary.Hex'' aparece en /system/framework/org.apache.http.legacy.boot.jar)

Luego usa:

public static String encode(String key, String data) { try { Mac hmac = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); hmac.init(secret_key); return new String(Hex.encodeHex(hmac.doFinal(data.getBytes("UTF-8")))); } catch (Exception e) { throw new RuntimeException(e); } }


Si usa Guava, su último lanzamiento ahora le permite usar

Hashing.hmacSha256()