Java 调用MessageDigest.getInstance(“SHA256”)时发生异常

Java 调用MessageDigest.getInstance(“SHA256”)时发生异常,java,cryptography,sha256,Java,Cryptography,Sha256,我有在Android上运行良好的代码。当我用JRE 1.6将它移植到我的Windows 64位机器上时,代码不起作用 当我运行以下代码行时: final MessageDigest digest = MessageDigest.getInstance("SHA256") 我得到以下例外情况: java.security.nosuchagorithmexception:SHA256 MessageDigest在sun.security.jca.GetInstance.GetInstance上不可

我有在Android上运行良好的代码。当我用JRE 1.6将它移植到我的Windows 64位机器上时,代码不起作用

当我运行以下代码行时:

final MessageDigest digest = MessageDigest.getInstance("SHA256")
我得到以下例外情况:

java.security.nosuchagorithmexception:SHA256 MessageDigest在sun.security.jca.GetInstance.GetInstance上不可用(未知源) 位于java.security.security.getImpl(未知源代码) java.security.MessageDigest.getInstance(未知源)

我在网上发现有人声称可以将SHA256与Sun JRE附带的标准加密提供程序一起使用,有人说我需要使用另一个提供程序,例如Bouncy Castle


我不希望使用其他提供商。有可能使它工作吗?

当您对JCA服务可以使用什么算法有疑问时,您的第一个调用端口应该是JCA。在符合JCA的JVM中,服务保证支持的算法为:

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512
提供商为这些算法提供别名是很常见的,这就是为什么它可能适用于Bouncy Castle,但如果可以的话,您应该坚持使用这些别名以最大限度地提高可移植性

如果将代码更改为以下内容,它将按预期工作:

final MessageDigest digest = MessageDigest.getInstance("SHA-256");

SHA-256应该是getInstance()的参数


谢谢。您在David Grant到达后一分钟到达,尽管链接已断开。是的,
“SHA256”
是Bouncy中的别名。我修复了一个Bouncy Castle bug,它在Bouncy的一个协议包中使用了
“SHA256”
,而不是JCE中的标准名称
“SHA-256”
。这是接受超过绝对最小值的危险——它以一种方式工作,但不能以另一种方式工作。那么,呃,当“保证”MD5失败时,你会怎么做。在Oracle JRE中,但仅在某些计算机上,而不是在其他计算机上。。。这让我现在很为难-(您是否检查了您的安全提供商?请确保为您的JVM版本获得正确的列表,java 8包含的算法多于java 6。