almacenamiento de contraseñas SHA2 con Java
-
09-10-2019 - |
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!
Solución
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.