Pregunta

Estoy intentando hacer una llamada XML-RPC que requiere HmacSHA-256 de hash de una cadena en particular. Actualmente estoy usando la biblioteca Jasypt con el siguiente código:

StandardPBEStringEncryptor sha256 = new StandardPBEStringEncryptor();
          sha256.setPassword(key);
          sha256.setAlgorithm("PBEWithHmacSHA2");

Al intentar el uso sha256.encrypt (cadena) me sale este error:

Exception in thread "main" org.jasypt.exceptions.EncryptionInitializationException: java.security.NoSuchAlgorithmException: PBEWithHmacAndSHA256 SecretKeyFactory not available
     at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:597)
     at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.initialize(StandardPBEStringEncryptor.java:488)
     at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:541)
     at nysenateapi.XmlRpc.main(XmlRpc.java:52)
    Caused by: java.security.NoSuchAlgorithmException: PBEWithHmacAndSHA256 SecretKeyFactory not available
     at javax.crypto.SecretKeyFactory.(DashoA13*..)
     at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
     at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:584)
     ... 3 more

He descargado la extensión JCE Criptografía y coloqué los frascos en mi BuildPath, pero eso no parece tener nada hecho. He intentado usar un número de combinaciones en setAlgorithm anteriormente, incluyendo "PBE", "PBEWithSha". (1 | 2 | 128 | 256) ?, "PBEWithHmacSha", etc.

También intentado usar BouncyCastle pero yo no tenía ninguna suerte allí tampoco. Cualquier ayuda o guía apreciados!

¿Fue útil?

Solución

Como correctamente señala @Rook deberá especificar un algoritmo de PBE que incluye un cifrado algoritmo. Dos ejemplos de muchos son "PBEWithSHA1AndDESede" que está soportado por la proveedor SunJCE y "PBEWITHSHA256AND128BITAES-CBC-BC" que está soportado por el proveedor de BouncyCastle JCE.

Otros consejos

Los comentarios fueron útiles, pero supongo que estaba haciendo la pregunta equivocada. Lo que estaba buscando hacer era imitar la función de PHP hash_hmac ( 'sha256', cadena, llave) ...

Terminé usando el siguiente código:

Mac mac = Mac.getInstance("HmacSha256");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSha256");
mac.init(secret);
byte[] shaDigest = mac.doFinal(phrase.getBytes());
String hash = "";
for(byte b:shaDigest) {
    hash += String.format("%02x",b);
}

Gracias por la guía, sin embargo. Seguramente me ayudará en el futuro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top