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