MessageDigest.getInstance(“SHA”)返回什么特定的哈希算法?
2022-09-01 13:03:27
MessageDigest.getInstance("SHA")
似乎有效并给了我一个,但我不知道它给了我什么算法。MessageDigest
是 SHA-1 还是 SHA-0 或 ..?
我对我的机器上发生的事情不感兴趣。我想知道它是否会为所有有效的Java实现返回sha0或sha1(或者它未定义)。
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 一起使用,某些 JCE 提供程序的 SHA == SHA-1。顺便说一句,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),它也将显示这些提供程序。