5
try {
        MessageDigest digest = MessageDigest.getInstance("SHA-512");
        byte[] output = digest.digest(password);

        digest.update(salt);
        digest.update(output);
        return new BigInteger(1, digest.digest());
    } catch (NoSuchAlgorithmException e) {
        throw new UnsupportedOperationException(e);
    }

但我得到了Exception in thread "main" java.security.NoSuchAlgorithmException: SHA_512 MessageDigest not available错误

4

5 回答 5

16

以下是Java 提供的标准哈希算法MessageDigest

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

您可能想要验证您提供给工厂方法的名称。

于 2013-02-17T04:49:59.723 回答
12

我想说最可能的解释是您的 REAL 代码具有"SHA_512"而不是"SHA-512". 当然,这可以解释为什么异常消息中有下划线。

另一种可能性是,由于美国出口限制,您的 JVM 删除了“军事实力”加密算法。但是,我认为这不太可能......

(事实上​​,我对此的解读是,SHA-512 无论如何都包含在默认“Sun”提供程序的所有版本中。)

于 2013-02-17T04:52:37.583 回答
7

这是可用于通过 SHA-512 获取哈希字符串的示例方法:

private static String getHashCodeFromString(String algorithm, String str) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance(algorithm);
    md.update(str.getBytes());
    byte byteData[] = md.digest();

    //convert the byte to hex format method 1
    StringBuffer hashCodeBuffer = new StringBuffer();
    for (int i = 0; i < byteData.length; i++) {
        hashCodeBuffer.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
    }
    return hashCodeBuffer.toString();
}

用作SHA-512算法。转到以下链接以获取您可以在方法中传递的其他可能的算法名称。https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest

于 2015-10-16T14:42:40.490 回答
2

MessageDigest 类是一个引擎类,旨在提供加密安全消息摘要(如 SHA-1 或 MD5)的功能。加密安全消息摘要采用任意大小的输入(字节数组),并生成固定大小的输出。

参考

打印所有MessageDigest 提供者 -

Provider provider[] = Security.getProviders();
for (Provider pro : provider) {
    System.out.println(pro);
    for (Enumeration e = pro.keys(); e.hasMoreElements();)
        System.out.println("\t" + e.nextElement());

}

幸运SHA-512的是存在但SHA_512不存在。:)

于 2013-02-17T04:46:39.190 回答
1

在 Groovy 语言中,您可以使用以下方法通过 SHA-512 生成哈希字符串。

它完全适合我。

public String getHashCodeFromString(String algorithm, String str) throws NoSuchAlgorithmException{
      MessageDigest md = MessageDigest.getInstance(algorithm);
      md.update(str.getBytes());
      def byteData = md.digest() as byte[];

      //convert the byte to hex format method 1
      StringBuffer hashCodeBuffer = new StringBuffer();
      for (int i = 0; i < byteData.length; i++) {
        hashCodeBuffer.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
      }
      return hashCodeBuffer.toString();
    }
于 2017-10-11T10:54:08.100 回答