MessageDigest的选择好多,包括MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160等等。我们如何选择呢?
选择考虑在两个方面:安全、速度。
MD2很安全,但是速度极慢,一般不用。
速度方面,最快的是MD4,MD5比SHA-1快
速度排名:MD4 > MD5 > RIPEMD-128 > SHA-1 > REPEMD-160
按照《应用密码学手册》提供的表格数据为:
MD4 长度 128 相对速度 1
MD5 长度 128 相对速度 0.68
REPEMD-128 长度 128 相对速度 0.39
SHA-1 长度 160 相对速度 0.29
REPEMD-160 长度 160 相对速度 0.24
我亲自测试的结果和《应用密码学手册》提供的数据接近。
MD4已经很早证明有缺陷,很少使用,最流行的是MD5和SHA-1,但MD5和SHA1也被王小云找到碰撞,证实不安全。
传说SHA-1比MD5要安全,但是SHA-1有美国国家安全局的背景,有人怀疑这个算法背后有不可告人的秘密,我也是阴谋论者之一,倾向选择MD5而不是SHA-1。王小云找到SHA-1碰撞之后,可以说传说的谣言破灭了,而且MD5速度要比SHA-1快差不多一倍,没有什么理由选择SHA-1。
----------------------------------
在Java的现实环境中是怎样?
在SUN的JCE实现中,只提供了MD2、MD5、SHA-1,SHA-256等常用的MessageDigest算法。
开源的JCE实现bouncycastle则提供了众多的实现,包括MD整个系列,SHA整个系列,RIPEMD整个系列。
很多的开源项目都带一个bcprov-jdk14.jar的包,可以说bouncycastle应用很广泛。SUN公司的一些项目也用了bouncycastle,例如JXTA。
但实际上,SUN的实现包括了MD4,但你需要这样使用:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->MessageDigest md = sun.security.provider.MD4.getInstance();
但是,JDK带实现性能要比bouncycastle性能好得多,相差速度通常超过一倍以上,我测试过MD5、SHA1和MD4,其性能差别都是类似,一倍多。
比较的结论:
bouncycastle开源免费,提供算法多,但速度较慢
SUN JCE提供的实现,包括了流行常用算法,速度很快,同类型算法比bouncycastle要快一倍以上。
----------------------------------
结论:
又要安全又要速度,选择MD5
追求安全,不在意速度,相信传说,不相信阴谋论,选择SHA系列
追求速度,安全次之,可以选择MD4。
----------------------------------
现实例子:
emule采用MD4和SHA-1两种结合使用
apache之类的技术网站,提供下载的文件,同时提供一个校验文件.md5
相关推荐
在本文中,我们介绍了 Java 中的 MessageDigest 类的 getInstance 方法。它是一个用于获取 MessageDigest 对象...当然,Java 提供了多种其他加密算法供选择,开发者可以根据实际需求选择合适的算法来保障数据的安全性。
本文中,我们简要介绍了Java MessageDigest类,并提供了一个使用SHA-256算法计算哈希值的完整实例和代码。MessageDigest类为我们提供了一种安全的方式来生成消息摘要,用于验证数据的完整性和比较数据的唯一性。虽然...
主要介绍了java自带的MessageDigest实现文本的md5加密算法,需要的朋友可以参考下
这是一个实现消息摘要算法 MD5 的 C++ 类。该算法的目的是计算给定位串的哈希值。MD5 产生一个 16 字节(128 位)的散列。 MD5 哈希已被证明在加密上容易受到各种攻击(谷歌它们),因此不应用于安全目的。该库的...
在实际应用中,我们应该根据具体的需求和安全要求选择合适的哈希算法。 通过本文,您应该对Java中MessageDigest的digest()方法有了更深入的了解。希望这篇文章能够帮助您更好地理解和应用哈希函数的概念和方法。
public static String md5(String str) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte b[] = md.digest();
javascript md5摘要算法的实现
ava.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。简单点说就是用于生成散列码。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于信息摘要...
支持 SM3 的 MessageDigest 接口、SM3withSM2 混合算法 支持 SM4 的 Cipher、KeyFactory、KeyGenerator、SecretKey 接口、相关算法 CMAC-SM4、Poly1305-SM4 增加 java.security.PublicKey 的子类 SM2PublicKey 增加...
7.3.3 java.security.MessageDigest 122 7.3.4 java.security.Signature 123 7.3.5 算法参数 124 7.3.6 java.security.Key和java.security. spec.KeySpec 126 7.3.7 java.security.KeyFactory和java. security....
可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作...
md5 的算法 import java.security.*; import java.security.spec.*; class MD5_Test{ public final static String MD5(String s){ char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', '...
Java中常用的加密算法主要有MD5,DES(对称加密),RSA(非对称加密),每一种加密算法有着各自的加密特点。(注意:本文为kotlin编码) ...其中,加密用到的类就是MessageDigest。 MD5 Demo加密如下: object MessageDige
java实现MD5算法 关键词: java MD5 import java.security.*; import java.util.*; /** * */ public class MD5 { private String inStr; private MessageDigest md5; /** * Constructs the MD5 object and ...
MD5的加密算法详解,针对16位加密char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { byte[] btInput = s.getBytes(); MessageDigest ...
Android MD5加密算与J2SE平台一模一样,因为Android 平台支持 java.security.MessageDigest这个包。实际上与J2SE平台一模一样。 算法签名: 代码如下:String getMD5(String val) throws NoSuchAlgorithmException ...
MessageDigest 类提供信息摘要算法的功能,他是抽象类,需要MessageDigest.getInstance才能拿到MessageDigest的对象。以MD5为例下面是我碰到的问题以及解决方式 ##注意点1.拿到对象 他是抽象类,需要 ...
MessageDigest md = MessageDigest.getInstance("MD5"); A = md.digest(s.getBytes()); } catch (Exception e) { System.err.println("Digest failed" + e); } return A; } // returns new hex ...
MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(strTemp); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int ...
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Sha256 { public static String getSHA256(String str){ MessageDigest messageDigest; String encodestr = ...