2012-09-28 67 views
16

我有一個在Android上運行良好的代碼。當我將它移植到帶有JRE 1.6的Windows 64位機器上時,代碼無法工作。異常調用MessageDigest.getInstance(「SHA256」)時

當我運行下面的代碼行:

final MessageDigest digest = MessageDigest.getInstance("SHA256") 

我得到以下異常:

java.security.NoSuchAlgorithmException: SHA256 MessageDigest not available 
at sun.security.jca.GetInstance.getInstance(Unknown Source) 
at java.security.Security.getImpl(Unknown Source) 
at java.security.MessageDigest.getInstance(Unknown Source) 

我在互聯網上的人聲稱這是可以使用SHA256與標準加密發現與Sun JRE一起提供的服務提供商,以及有人說我需要使用另一個提供商,例如Bouncy Castle。

我寧願不使用不同的供應商。是否有可能使其工作?

回答

29

如果您不確定什麼算法,您可以使用一個JCA的服務,您的第一個停靠港應該是JCA Standard Algorithm Name Documentation保證的算法,以通過在符合JCA-JVM的MessageDigest服務支持有:

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

是很常見的提供商來爲這些算法提供的別名,這就是爲什麼它很可能與充氣城堡的工作,但如果你能最大限度地提高便攜性,你應該堅持這些。

如果你改變你的代碼下面,它會按預期工作:

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

是,'「SHA256 「'是Bouncy中的別名。我有一個充氣城堡錯誤修復所用'「SHA256」'在快活的協議包中的一個,而不是'「SHA256」'這已經在JCE的標準名稱。這是接受比絕對最低更加的危險 - 它的作品的一種方式,但不是其他。 –

+1

所以,呃,你當「保證」 MD5失敗怎麼辦。在Oracle JRE中,但只在某些機器上,而不在其他機器上......這讓我立即陷入困境。 :-( –

+0

你檢查你的安全提供? –