使用Java进行SHA2密码存储

时间:2010-10-20 21:33:44

标签: java security encryption xml-rpc jasypt

我正在尝试进行需要HmacSHA-256散列特定字符串的XML-RPC调用。我目前正在使用带有以下代码的Jasypt库:

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

在尝试使用sha256.encrypt(字符串)时出现此错误:

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

我下载了JCE Cryptography扩展并将jar放在我的buildpath中,但这似乎没有做任何事情。我尝试在上面的setAlgorithm中使用了许多组合,包括“PBE”,“PBEWithSha”(1 | 2 | 128 | 256)?,“PBEWithHmacSha”等。

我也尝试过使用BouncyCastle,但我也没有运气。任何帮助或指导表示赞赏!

2 个答案:

答案 0 :(得分:2)

正如@Rook正确指出的那样,您需要指定包含加密算法的PBE算法。其中两个例子是"PBEWithSHA1AndDESede"SunJCE provider"PBEWITHSHA256AND128BITAES-CBC-BC"支持Bouncycastle JCE提供商支持。

答案 1 :(得分:1)

评论很有帮助,但我想我问的是错误的问题。我想做的是模仿PHP函数hash_hmac('sha256',string,key)......

我最终使用了以下代码:

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

感谢您的指导。肯定会在将来帮助我。