MessageDigest.getInstance(“SHA”)返回什么特定的哈希算法?

2022-09-01 13:03:27

MessageDigest.getInstance("SHA")似乎有效并给了我一个,但我不知道它给了我什么算法。MessageDigest

是 SHA-1 还是 SHA-0 或 ..?


我对我的机器上发生的事情不感兴趣。我想知道它是否会为所有有效的Java实现返回sha0或sha1(或者它未定义)。


答案 1

JCE 规范列出了实现应支持的标准名称。指定了“SHA-1”,以及 SHA-256、SHA-384 和 SHA-512。“SHA”、“SHA-0”和 SHA-2“不是标准名称,因此可能根本不受支持。您无法保证“SHA”将返回什么,如果有的话,因为它不在标准中。


答案 2

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),它也将显示这些提供程序。


推荐