Domanda

Sto cercando di fare una chiamata XML-RPC che richiede HmacSHA-256 hash di una particolare stringa. Attualmente sto usando la libreria Jasypt con il seguente codice:

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

per provare ad usare sha256.encrypt (stringa) ottengo questo errore:

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

Ho scaricato l'estensione JCE Crittografia e messo i barattoli nel mio buildpath, ma che non sembrano avere fatto nulla. Ho provato con un numero di combinazioni in setAlgorithm sopra, tra cui "PBE", "PBEWithSha". (1 | 2 | 128 | 256) ?, "PBEWithHmacSha", etc

Ho anche provato ad utilizzare BouncyCastle ma non ho avuto fortuna neanche lì. Qualsiasi aiuto o di orientamento apprezzato!

È stato utile?

Soluzione

Come giustamente osservato dal @Rook è necessario specificare un algoritmo di PBE che include un la crittografia algoritmo. Due esempi dei molti sono "PBEWithSHA1AndDESede" che è supportato dalla fornitore SunJCE e "PBEWITHSHA256AND128BITAES-CBC-BC" che è supportato dal provider BouncyCastle JCE.

Altri suggerimenti

I commenti sono stati utili ma immagino che stavo chiedendo la domanda sbagliata. Quello che stavo cercando di fare era imitare la funzione PHP hash_hmac ( 'sha256', string, chiave) ...

Ho finito per usare il seguente codice:

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

Grazie per la guida, però. Sicuramente mi aiuterà in futuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top