2010-10-20 11 views
2

Je tente d'effectuer un appel XML-RPC qui nécessite le hachage HmacSHA-256 d'une chaîne particulière. Je suis actuellement en utilisant la bibliothèque Jasypt avec le code suivant:Stockage de mot de passe SHA2 avec Java

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

En essayant d'utiliser sha256.encrypt (string) Je reçois cette erreur:

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 

J'ai téléchargé l'extension Cryptographie et placé JCE les pots dans mon buildpath, mais cela ne semble pas avoir fait quoi que ce soit. J'ai essayé d'utiliser un certain nombre de combinaisons dans setAlgorithm ci-dessus, y compris "PBE", "PBEWithSha" (1 | 2 | 128 | 256) ?, "PBEWithHmacSha", etc.

J'ai également essayé d'utiliser BouncyCastle mais je n'ai pas Je n'ai pas de chance non plus. Toute aide ou conseil apprécié!

+1

Une fonction de résumé de message n'est pas une fonction de cryptage. – rook

+0

Merci pour la clarification. – Jared

Répondre

2

Comme noté correctement par @Rook, vous devez spécifier un algorithme PBE qui inclut un algorithme de chiffrement . Deux exemples sur plusieurs sont "PBEWithSHA1AndDESede" qui est pris en charge par les SunJCE provider et "PBEWITHSHA256AND128BITAES-CBC-BC" qui est pris en charge par le fournisseur JCE Bouncycastle.

+0

Très utile, merci. – Jared

1

Les commentaires ont été utiles mais je suppose que je posais la mauvaise question. Ce que je cherchais à faire était mimer la fonction PHP hash_hmac (« SHA256 », chaîne, clé) ...

J'ai fini en utilisant le code suivant:

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); 
} 

Merci pour les conseils, cependant. Va sûrement m'aider dans le futur.

+0

Si expression est une chaîne, vous devriez envisager de spécifier un encodage dans getBytes() sinon vous risquez de perdre des informations lorsque du texte non-ascii est haché. (Pour être compatible avec PHP, je pense que cela dépend de 'mb_internal_encoding()' de l'installation/requête PHP). Le plus utile pourrait être UTF-8 car il sera sensible aux accents. – eckes

Questions connexes