![](/img/trans.png)
[英]MessageDigest.getInstance(algorithm) always throwing NoSuchAlgorithmException
[英]What specific hash algorithm does MessageDigest.getInstance(“SHA”) return?
MessageDigest.getInstance("SHA")
似乎工作並給我一個MessageDigest
,但我不知道它給了我什么算法。
是SHA-1還是SHA-0或..?
我對我的機器上發生的事情不感興趣。 我想知道它是否會為所有有效的Java實現返回sha0或sha1(或者它是未定義的)。
JCE規范列出了預期實現支持的標准名稱。 指定了“SHA-1”,SHA-256,SHA-384和SHA-512也是如此。 “SHA”,“SHA-0”和SHA-2“不是標准名稱,因此可能根本不受支持。您無法保證”SHA“將返回什么,如果有的話,因為它不在標准中。
SHA-0已過時。 與Java JCE MessageDigest一起使用時,SHA == SHA-1用於某些JCE提供程序。 順便說一下,使用今天的計算機和技術,SHA-1不被認為是安全的。 SHA-512對於任何東西都是安全的。 對於大多數事情,SHA-256仍然適用。
您可以使用此代碼列出正在使用的Java版本中可用的協議。 (我明白了 ):
import java.security.Provider;
import java.security.Security;
public class JceLook {
public static void main(String[] args) {
System.out.println("Algorithms Supported in this JCE.");
System.out.println("====================");
// heading
System.out.println("Provider: type.algorithm -> className" + "\n aliases:" + "\n attributes:\n");
// discover providers
Provider[] providers = Security.getProviders();
for (Provider provider : providers) {
System.out.println("<><><>" + provider + "<><><>\n");
// discover services of each provider
for (Provider.Service service : provider.getServices()) {
System.out.println(service);
}
System.out.println();
}
}
}
它將為所有可用的算法顯示這樣的信息。 (請注意,這是上面程序的實際輸出,用於Oracle / Sun Java 6的某些更新級別,它表明SHA等同於SHA-1和SHA1。您可以將三個字符串中的任何一個傳遞給MessageDigest並獲得相同的結果但這取決於加密提供程序(JCE),可能不一樣。)
SUN: MessageDigest.SHA -> sun.security.provider.SHA
aliases: [SHA-1, SHA1]
attributes: {ImplementedIn=Software}
如果您加載其他提供程序(例如BouncyCastle),它也會顯示這些提供程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.