29

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

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


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

4

2 回答 2

26

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

于 2013-02-15T22:55:52.230 回答
19

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),它也会显示这些供应商。

于 2013-02-15T21:35:46.580 回答