📄 hash+
字号:
息首先被拆成若干个512位的分组,其中最后512位一个分组是“消息尾+填充字节(100…0)+64
位消息长度”,以确保对于不同长度的消息,该分组不相同。64位消息长度的限制导致了MD5安全的输入长度必须小于264bit,因为大于64位的长度信
息将被忽略。而4个32位寄存器字初始化为A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210,
它们将始终参与运算并形成最终的散列结果。 </p><p>接着各个512位消息分组以16个32位字的形式进入算法的主循环,512位消息分组的个数据决定了循环的次数。主循环有4轮,每轮分别用到了非线性函数 </p><p>F(X, Y, Z) = (X ∧ Y) ∨ (~X ∧ Z) <br>G(X, Y, Z) = (X ∧ Z) ∨ (Y ∧ ~Z) <br>H(X, Y, Z) =X ⊕ Y ⊕ Z <br>I(X, Y, Z) = X ⊕ (Y ∨ ~Z) <br>这4
轮变换是对进入主循环的512位消息分组的16个32位字分别进行如下操作:将A、B、C、D的副本a、b、c、d中的3个经F、G、H、I运算后的结果
与第4个相加,再加上32位字和一个32位字的加法常数,并将所得之值循环左移若干位,最后将所得结果加上a、b、c、d之一,并回送至ABCD,由此完
成一次循环。 </p><p>所用的加法常数由这样一张表T[i]来定义,其中i为1…64,T[i]是i的正弦绝对值之4294967296次方的整数部分,这样做是为了通过正弦函数和幂函数来进一步消除变换中的线性性。 </p><p>当所有512位分组都运算完毕后,ABCD的级联将被输出为MD5散列的结果。下面是一些MD5散列结果的例子: </p><p>MD5 ("") = d41d8cd98f00b204e9800998ecf8427e <br>MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 <br>MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 <br>MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 <br>MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b <br>MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f <br>MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a <br>参考相应RFC文档可以得到MD4、MD5算法的详细描述和算法的C源代码。 </p><p>3) SHA1 及其他 <br>SHA1
是由NIST
NSA设计为同DSA一起使用的,访问http://www.itl.nist.gov/fipspubs可以得到它的详细规范--[/url]
"FIPS PUB 180-1 SECURE HASH
STANDARD"。它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1
设计时基于和MD4相同原理,并且模仿了该算法。因为它将产生160bit的散列值,因此它有5个参与运算的32位寄存器字,消息分组和填充方式与MD5
相同,主循环也同样是4轮,但每轮进行20次操作,非线性运算、移位和加法运算也与MD5类似,但非线性函数、加法常数和循环左移操作的设计有一些区别,
可以参考上面提到的规范来了解这些细节。下面是一些SHA1散列结果的例子: </p><p>SHA1 ("abc") = a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d <br>SHA1 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1 <br>其
他一些知名的Hash算法还有MD2、N-Hash、RIPE-MD、HAVAL等等。上面提到的这些都属于"纯"Hash算法。还有另2类Hash算
法,一类就是基于对称分组算法的单向散列算法,典型的例子是基于DES的所谓Davies-Meyer算法,另外还有经IDEA改进的Davies-
Meyer算法,它们两者目前都被认为是安全的算法。另一类是基于模运算/离散对数的,也就是基于公开密钥算法的,但因为其运算开销太大,而缺乏很好的应
用前景。 </p><p></p><p>没有通过分析和差分攻击考验的算法,大多都已经夭折在实验室里了,因此,如果目前流行的Hash算法能完全符合
密码学意义上的单向性和抗冲突性,就保证了只有穷举,才是破坏Hash运算安全特性的唯一方法。为了对抗弱抗冲突性,我们可能要穷举个数和散列值空间长度
一样大的输入,即尝试2^128或2^160个不同的输入,目前一台高档个人电脑可能需要10^25年才能完成这一艰巨的工作,即使是最高端的并行系统,
这也不是在几千年里的干得完的事。而因为"生日攻击"有效的降低了需要穷举的空间,将其降低为大约1.2*2^64或1.2*2^80,所以,强抗冲突性
是决定Hash算法安全性的关键。 </p><p>在NIST新的 Advanced Encryption Standard (AES)中,使用了长度为128、192、256bit 的密钥,因此相应的设计了 SHA256、SHA384、SHA512,它们将提供更好的安全性。 </p><p></p><p>Hash算法在信息安全方面的应用主要体现在以下的3个方面: </p><p>1) 文件校验 <br>我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 </p><p>MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。它常被用在下面的2种情况下: </p><p>第
一是文件传送后的校验,将得到的目标文件计算 md5 checksum,与源文件的md5 checksum 比对,由两者 md5
checksum
的一致性,可以从统计上保证2个文件的每一个码元也是完全相同的。这可以检验文件传输过程中是否出现错误,更重要的是可以保证文件在传输过程中未被恶意篡
改。一个很典型的应用是ftp服务,用户可以用来保证多次断点续传,特别是从镜像站点下载的文件的正确性。 </p><p>更出色的解决方法是所谓的代
码签名,文件的提供者在提供文件的同时,提供对文件Hash值用自己的代码签名密钥进行数字签名的值,及自己的代码签名证书。文件的接受者不仅能验证文件
的完整性,还可以依据自己对证书签发者和证书拥有者的信任程度,决定是否接受该文件。浏览器在下载运行插件和java小程序时,使用的就是这样的模式。
</p><p>第二是用作保存二进制文件系统的数字指纹,以便检测文件系统是否未经允许的被修改。不少系统管理/系统安全软件都提供这一文件系统完整性评
估的功能,在系统初始安装完毕后,建立对文件系统的基础校验和数据库,因为散列校验和的长度很小,它们可以方便的被存放在容量很小的存储介质上。此后,可
以定期或根据需要,再次计算文件系统的校验和,一旦发现与原来保存的值有不匹配,说明该文件已经被非法修改,或者是被病毒感染,或者被木马程序替代。
TripWire就提供了一个此类应用的典型例子。 </p><p>更完美的方法是使用"MAC"。"MAC"
是一个与Hash密切相关的名词,即信息鉴权码(Message Authority
Code)。它是与密钥相关的Hash值,必须拥有该密钥才能检验该Hash值。文件系统的数字指纹也许会被保存在不可信任的介质上,只对拥有该密钥者提
供可鉴别性。并且在文件的数字指纹有可能需要被修改的情况下,只有密钥的拥有者可以计算出新的散列值,而企图破坏文件完整性者却不能得逞。 </p><p>2) 数字签名 <br>Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 </p><p>在这种签名协议中,双方必须事先协商好双方都支持的Hash函数和签名算法。 </p><p>签名方先对该数据文件进行计算其散列值,然后再对很短的散列值结果--如Md5是16个字节,SHA1是20字节,用非对称算法进行数字签名操作。对方在验证签名时,也是先对该数据文件进行计算其散列值,然后再用非对称算法验证数字签名。 </p><p>对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点: </p><p>首先,数据文件本身可以同它的散列值分开保存,签名验证也可以脱离数据文件本身的存在而进行。 </p><p>再
者,有些情况下签名密钥可能与解密密钥是同一个,也就是说,如果对一个数据文件签名,与对其进行非对称的解密操作是相同的操作,这是相当危险的,恶意的破
坏者可能将一个试图骗你将其解密的文件,充当一个要求你签名的文件发送给你。因此,在对任何数据文件进行数字签名时,只有对其Hash值进行签名才是安全
的。 </p><p>3) 鉴权协议 <br>如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。 </p><p>需
要鉴权的一方,向将被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash
运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash
运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。 </p><p>POP3协议中就有这一应用的典型例子: </p><p>S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> <br>C: APOP mrose c4c9334bac560ecc979e58001b3e22fb <br>S: +OK maildrop has 1 message (369 octets) <br>在
上面的一段POP3协议会话中,双方都共享的对称密钥(鉴权口令字)是tanstaaf,服务器发出的挑战是<
1896.697170952@dbc.mtview.ca.us>,客户端对挑战的应答是MD5("<
1896.697170952@dbc.mtview.ca.us>tanstaaf") =
c4c9334bac560ecc979e58001b3e22fb,这个正确的应答使其通过了认证。 </p><p></p><p>散列算法长期以来一直在计算机科学中大量应用,随着现代密码学的发展,单向散列函数已经成为信息安全领域中一个重要的结构模块,我们有理由深入研究其设计理论和应用方法。</p></div>
</div>
<center><script type="text/javascript">
<!--
google_ad_client = "pub-8762723865019686";
google_ad_width = 728;
google_ad_height = 15;
google_ad_format = "728x15_0ads_al_s";
//2007-09-04: 新闻页
google_ad_channel = "2064388623";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//--></script><script src="hash%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95_files/show_ads.js" type="text/javascript"></script><iframe name="google_ads_frame" src="hash%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95_files/ads_002.htm" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" frameborder="0" height="15" scrolling="no" width="728"></iframe></center>
<div style="padding-right: 20px; text-align: right;">
阅读:<span id="news_hits">17624</span> 次<br>
录入:<a href="http://www.xmlasp.net/memberProfile.aspx?id=2" target="_blank">木鸟</a><br><br>
【 <a href="http://www.xmlasp.net/mail.aspx?ID=923" target="_blank">推荐</a> 】
【 <a href="javascript:doPrint()">打印</a> 】
</div>
<div style="padding-left: 20px;">
上一篇:<a href="http://www.xmlasp.net/n922c43.aspx">ASProtect的加密算法初步分析</a><br>
下一篇:<a href="http://www.xmlasp.net/n924c43.aspx">对3DES加密的运用的一个简单示例</a>
</div>
</div>
</div>
<div class="bl"></div>
<div class="br"></div>
<div class="bm"></div>
</div>
<div class="mframe">
<div class="tl"></div>
<div class="tr"></div>
<div class="tm">
<span class="tt">相关新闻</span>
</div>
<div class="wrapper">
<div class="ml"></div>
<div class="mr"></div>
<div class="mm">
</div>
</div>
<div class="bl"></div>
<div class="br"></div>
<div class="bm"></div>
</div>
<div class="mframe">
<div class="tl"></div>
<div class="tr"></div>
<div class="tm">
<span class="tt">本文评论</span>
<a href="http://www.xmlasp.net/remark.aspx?id=923" target="_blank" style="">全部评论</a>
</div>
<div class="wrapper">
<div class="ml"></div>
<div class="mr"></div>
<div class="mm">
<img src="hash%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95_files/face18.gif" alt="">
虾米
<span class="gray">(W
,05月02日
)</span><br>
<img src="hash%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95_files/face1.gif" alt="">
不懂
<span class="gray">(K
,03月12日
)</span><br>
<img src="hash%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95_files/face14.gif" alt="">
good
<span class="gray">(M
,02月12日
)</span><br>
</div>
</div>
<div class="bl"></div>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -