2013-02-17 240 views
4
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错误SHA-512不受Java支持?

+0

http://mustafacanturk.com/sha512-hashing-on-java/ – 2013-02-17 04:42:09

+3

异常消息不代码匹配:'SHA_512' VS在'SHA-512'的代码正确的值。 – laz 2013-02-17 04:45:09

+0

对不起我的错误谢谢 – user236501 2013-02-17 04:55:06

回答

11

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

另一种可能性是,由于美国的出口限制,您的JVM的“军事强度”加密算法被删除。但是,我认为这是件不可思议的事......

(事实上,我的阅读this是,SHA-512被列入默认的“SUN”提供者的所有版本反正。)

+0

缺省情况下,JDK中未包含AES-256 - 读取https:// knowledge.safe.com/articles/395/enabling-aes256-in-the-java-runtime-environment-fo.html。 – Xdg 2016-01-19 13:01:17

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

} 

而且fortunatly SHA-512是有,但SHA_512不是。 :)

13

由Java MessageDigest提供standard hashing algorithms以下:

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

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

+0

Java支持SHA3吗? – user236501 2013-02-17 05:02:56

+0

别管我以前的评论。默认情况下,Java不附带SHA3 MessageDigest提供程序。但它看起来像[BouncyCastle](http://www.bouncycastle.org/releasenotes.html)已将其纳入其图书馆。 – Perception 2013-02-17 05:09:23

+0

请注意,SHA-384实现通过截断SHA-512的结果来工作,因此它需要与SHA-512相同的计算量。 – Corne 2015-09-11 21:03:19

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

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(); 
    } 
相关问题