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
错误
答案 0 :(得分:14)
以下是Java MessageDigest
提供的standard hashing algorithms:
您可能需要验证要提供给工厂方法的名称。
答案 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。加密安全的消息摘要需要 任意大小的输入(字节数组),并生成固定大小 输出
打印所有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
不存在。 :)
答案 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();
}