两种热门的哈希算法的比较和对比-MD5算法与SHA (两种热门的哈密瓜品种)
概述
散列算法是一种将任意长度的数据转换为固定长度输出(称为散列值)的数学函数。MD5和SHA-256是两种常用的散列算法,它们在数据完整性验证和密码存储等应用中发挥着重要作用。
MD5算法
MD5算法是一种不可逆的散列算法,它将输入数据转换为一个32位的16进制散列值。由于其不可逆性和快速计算的特点,MD5算法在数据完整性验证和密码存储方面得到广泛应用。
MD5算法的安全性逐渐受到质疑。由于其散列值长度较短,攻击者可以通过穷举攻击或彩虹表攻击等方法,在较短的时间内找到与目标散列值相匹配的原始数据。
SHA-256算法
SHA-256算法是一种更安全的散列算法,它将输入数据转换为一个256位的散列值。SHA-256算法与MD5算法类似,但具有更高的安全性和更低的碰撞概率。
由于其较长的散列值长度和更复杂的计算过程,SHA-256算法比MD5算法更难被破解。在实际应用中,SHA-256算法被广泛用于数字签名、数据完整性验证、密码存储和加密通信等领域。
特征对比
特征 | MD5 | SHA-256 |
---|---|---|
散列值长度 | 32位(16进制) | 256位(16进制) |
不可逆性 | 是 | 是 |
高度唯一性 | 高 | 更高 |
快速计算 | 是 | 否 |
安全性 | 受到质疑 | 较高 |
应用场景
MD5算法虽然安全性较低,但由于其快速计算的特点,仍然可以在一些场景中使用,例如:
- 数据完整性验证(例如,验证文件是否被篡改)
- 密码存储(但建议采用更安全的算法,如SHA-256)
SHA-256算法更安全,适用于以下场景:
- 数字签名
- 数据完整性验证
- 密码存储
- 加密通信
结论
MD5和SHA-256算法都是常用的散列算法,各有其优缺点。对于需要高度安全性的应用,建议使用SHA-256算法。对于需要快速计算且安全性要求不高的应用,MD5算法仍然可以使用。
随着计算能力的提升和攻击技术的不断发展,散列算法的安全性也在不断演变。在选择散列算法时,需要根据具体的应用场景和安全需求,选择最合适的算法。
ASP.NET中MD5与SHA1加密的几种方法
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa>需要加密的明文</param> /// <returns>返回16位加密结果,该结果取32位加密结果的第9位到25位</returns> public string Get_MD5_Method1(string strSource) { //new 5 md5 = new 5CryptoServiceProvider(); //获取密文字节数组 byte[] bytResult = ((strSource)); //转换成字符串,并取9到25位 string strResult = (bytResult, 4, 8); //转换成字符串,32位 //string strResult = (bytResult); //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉 strResult = (-, ); return strResult; } /**//// <summary> /// 方法二:通过调用特定加密算法的抽象类上的 Create 方法,创建实现特定加密算法的对象。 /// </summary> /// <param>需要加密的明文</param> /// <returns>返回32位加密结果</returns> public string Get_MD5_Method2(string strSource) { string strResult = ; //Create 5 md5 = (); //注意编码UTF8、UTF7、Unicode等的选择 byte[] bytResult = ((strSource)); //字节类型的数组转换为字符串 for (int i = 0; i < ; i++) { //16进制转换 strResult = strResult + bytResult[i](X); } return strResult; } /**//// <summary> /// 方法三:直接使用HashPasswordForStoringInConfigFile生成 /// </summary> /// <param>需要加密的明文</param> /// <returns>返回32位加密结果</returns> public string Get_MD5_Method3(string strSource) { return (strSource, MD5); } 这些加密函数都是在服务器端执行,也就是说,当用户输入密码后,从客户端到服务器端传输时,用户的密码没有任何保护,很危险。 银行的做法是在客户端安装ActiveX控件,在客户端就把一些重要信息进行加密,再发送。 这个偶就不会拉,很希望能学习学习做这种ActiveX控件。
哈希加密算法
MD5即Message-Digest Algorithm 5(信息摘要算法5),是计算机广泛使用的散列算法之一。经MD2、MD3和MD4发展而来,诞生于20世纪90年代初。用于确保信息传输完整一致。虽然已被破解,但仍然具有较好的安全性,加之可以免费使用,所以仍广泛运用于数字签名、文件完整性验证以及口令加密等领域。
算法原理:
散列算法得到的结果位数是有限的,比如MD5算法计算出的结果字长为128位,意味着只要我们穷举2^128次,就肯定能得到一组碰撞,下面让我们来看看一个真实的碰撞案例。我们之所以说MD5过时,是因为它在某些时候已经很难表现出散列算法的某些优势——比如在应对文件的微小修改时,散列算法得到的指纹结果应当有显著的不同,而下面的程序说明了MD5并不能实现这一点。
而诸如此类的碰撞案例还有很多,上面只是原始文件相对较小的一个例子。事实上现在我们用智能手机只要数秒就能找到MD5的一个碰撞案例,因此,MD5在数年前就已经不被推荐作为应用中的散列算法方案,取代它的是SHA家族算法,也就是安全散列算法(Secure Hash Algorithm,缩写为SHA)。
SHA实际包括有一系列算法,分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-512。而我们所说的SHA2实际是对后面4中的统称。各种SHA算法的数据比较如下表,其中的长度单位均为位:
MD5和SHA1,它们都有4个逻辑函数,而在SHA2的一系列算法中都采用了6个逻辑函数。 以SHA-1为例,算法包括有如下的处理过程:
和MD5处理输入方式相同
经过添加位数处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组,可以得到一定数量的明文分组,我们用Y ,Y ,……Y 表示这些明文分组。对于每一个明文分组,都要重复反复的处理,这些与MD5都是相同的。
而对于每个512位的明文分组,SHA1将其再分成16份更小的明文分组,称为子明文分组,每个子明文分组为32位,我们且使用M[t](t= 0, 1,……15)来表示这16个子明文分组。然后需要将这16个子明文分组扩充到80个子明文分组,我们将其记为W[t](t= 0, 1,……79),扩充的具体方法是:当0≤t≤15时,Wt = Mt;当16≤t≤79时,Wt = ( W ⊕ W ⊕ W ⊕ W ) <<< 1,从而得到80个子明文分组。
所谓初始化缓存就是为链接变量赋初值。前面我们实现MD5算法时,说过由于摘要是128位,以32位为计算单位,所以需要4个链接变量。同样SHA-1采用160位的信息摘要,也以32位为计算长度,就需要5个链接变量。我们记为A、B、C、D、E。其初始赋值分别为:A = 0x、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x、E = 0xC3D2E1F0。
如果我们对比前面说过的MD5算法就会发现,前4个链接变量的初始值是一样的,因为它们本来就是同源的。
经过前面的准备,接下来就是计算信息摘要了。SHA1有4轮运算,每一轮包括20个步骤,一共80步,最终产生160位的信息摘要,这160位的摘要存放在5个32位的链接变量中。
在SHA1的4论运算中,虽然进行的就具体操作函数不同,但逻辑过程却是一致的。首先,定义5个变量,假设为H0、H1、H2、H3、H4,对其分别进行如下操作:
(A)、将A左移5为与 函数的结果求和,再与对应的子明文分组、E以及计算常数求和后的结果赋予H0。
(B)、将A的值赋予H1。
(C)、将B左移30位,并赋予H2。
(D)、将C的值赋予H3。
(E)、将D的值赋予H4。
(F)、最后将H0、H1、H2、H3、H4的值分别赋予A、B、C、D
这一过程表示如下:
而在4轮80步的计算中使用到的函数和固定常数如下表所示:
经过4轮80步计算后得到的结果,再与各链接变量的初始值求和,就得到了我们最终的信息摘要。而对于有多个明文分组的,则将前面所得到的结果作为初始值进行下一明文分组的计算,最终计算全部的明文分组就得到了最终的结果。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。