Java不支持SHA-512?

时间:2013-02-17 04:36:44

标签: java hash sha

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错误

5 个答案:

答案 0 :(得分:14)

以下是Java MessageDigest提供的standard hashing algorithms

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

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

答案 1 :(得分:11)

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

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

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

答案 2 :(得分: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

答案 3 :(得分:2)

  

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

Reference

打印所有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-512SHA_512不存在。 :)

答案 4 :(得分: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();
    }