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

meg*_*ord 27 java cryptography undefined-behavior

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

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


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

Sim*_* G. 25

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

  • 1997年的[Java™加密体系结构API规范与参考](http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/security/CryptoSpec.html#AppA)指定**SHA**与**SHA-1**相同​​.2014年的Java 7版本将声明移至[Java™加密体系结构标准算法名称文档](https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html),但列出**MessageDigest的SHA-1,SHA-256,SHA-384,SHA-512**. (4认同)

Lee*_*dor 17

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它将为所有可用的算法显示这样的信息.(请注意,这是上面程序的实际输出,用于Oracle/Sun Java 6的某些更新级别,它表明SHA等同于SHA-1和SHA1.您可以将三个字符串中的任何一个传递给MessageDigest并获得相同的结果但这取决于加密提供程序(JCE),可能不一样.)

SUN: MessageDigest.SHA -> sun.security.provider.SHA
  aliases: [SHA-1, SHA1]
  attributes: {ImplementedIn=Software}
Run Code Online (Sandbox Code Playgroud)

如果您加载其他提供程序(例如BouncyCastle),它也会显示这些提供程序.