【问题标题】:SHA2 password storage with Java使用 Java 存储 SHA2 密码
【发布时间】:2011-04-28 07:19:28
【问题描述】:

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

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

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

线程“主”org.jasypt.exceptions.EncryptionInitializationException 中的异常:java.security.NoSuchAlgorithmException:PBEWithHmacAndSHA256 SecretKeyFactory 不可用
     在 org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:597)
     在 org.jasypt.encryption.pbe.StandardPBEStringEncryptor.initialize(StandardPBEStringEncryptor.java:488)
     在 org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:541)
     在 nysenateapi.XmlRpc.main(XmlRpc.java:52)
    引起:java.security.NoSuchAlgorithmException:PBEWithHmacAndSHA256 SecretKeyFactory 不可用
     在 javax.crypto.SecretKeyFactory.(DashoA13*..)
     在 javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
     在 org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:584)
     ... 3 更多

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

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

【问题讨论】:

  • 消息摘要函数不是加密函数。
  • 感谢您的澄清。

标签: java security encryption xml-rpc jasypt


【解决方案1】:

正如@Rook 正确指出的,您需要指定一个包含 加密 算法的 PBE 算法。众多示例中的两个示例是 "PBEWithSHA1AndDESede",由 SunJCE provider 支持,"PBEWITHSHA256AND128BITAES-CBC-BC" 由 Bouncycastle JCE 提供程序支持。

【讨论】:

    【解决方案2】:

    cmets 很有帮助,但我想我问错了问题。我想做的是模仿 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);
    }
    

    感谢您的指导。以后一定会帮到我的。

    【讨论】:

    • 如果 phrase 是一个字符串,你应该考虑在 getBytes() 中指定一个编码,否则当非 ascii 文本被散列时你可能会丢失信息。 (为了与 PHP 兼容,我认为这取决于 PHP 安装/请求的mb_internal_encoding())。最有用的可能是 UTF-8,因为它会区分重音。
    猜你喜欢
    • 2011-10-13
    • 2018-10-18
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多