" java.security.NoSuchAlgorithmException:SHA3-384 MessageDigest不可用"用Java 9

时间:2017-12-31 05:35:58

标签: java hash sha-3

我尝试调用下面提到的.Select(x => (int) x)函数 -

hash(String plainText)

并收到此错误 -

import java.security.MessageDigest;
import java.lang.Exception;
import java.util.Base64;

public class MyHash {

    private MessageDigest messageDigest = null;
    private String algo = "SHA3-384";

    public String hash(String plainText)
    {
        byte[] hashBytes = null;

        try
        {
            messageDigest = MessageDigest.getInstance(algo);
            messageDigest.update( plainText.getBytes() );
            hashBytes = messageDigest.digest();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return Base64.getEncoder().encodeToString(hashBytes);
   } 
}

此外,java.security.NoSuchAlgorithmException: SHA3-384 MessageDigest not available at sun.security.jca.GetInstance.getInstance(java.base@9-internal/GetInstance.java:159) at java.security.Security.getImpl(java.base@9-internal/Security.java:695) at java.security.MessageDigest.getInstance(java.base@9-internal/MessageDigest.java:174) at MyHash.hash(MyHash.java:16) at Main.main(Main.java:36) -

的输出
java -version

不知道为什么我收到此错误。任何帮助将不胜感激。

修改1:

这些是支持的算法 -

openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)

编辑2:

Oracle JDK 9.0.1

没有错误

3 个答案:

答案 0 :(得分:2)

OpenJdk 9也应按照以下链接实现。

JEP 287: SHA-3 Hash Algorithms

尝试在您的环境中运行以下代码,看看支持所有算法。

 public static void main(String[] args) {

                for (Provider provider : Security.getProviders()) {
                    System.out.println("Provider: " + provider.getName());
                    for (Provider.Service service : provider.getServices()) {
                        System.out.println("  Algorithm: " + service.getAlgorithm());
                    }
                }


    }

不确定,但我认为您提供的链接指向Oracle的JDK,而您使用的是openjdk。

答案 1 :(得分:1)

Oracle JDK在JDK9中开始支持来自https://bugs.openjdk.java.net/browse/JDK-8000415的SHA3-384算法。 JDK9将有此修复。

答案 2 :(得分:0)

我已将JDK更新为Oracle的JDK 9.0.1,并且可以使用<=>而没有任何错误。 更新后输出SHA3-384 -

java -version