md5详细说明
不同文件或者字符串md5后的值可能一样吗?
以前总以为MD5后的值一样,就表示原始数据也是一样的,但是实际想想,有限的集合去映射无限的数据,确实可能出现碰撞。
<?php
$data1="\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c\x2f\xca\xb5\x07\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\xf1\x41\x5a\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\x72\x80\x37\x3c\x5b\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6\xdd\x53\xe2\x34\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\x28\x0d\x1e\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\xab\x6f\xf7\x2a\x70";
$data2="\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c\x2f\xca\xb5\x87\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\x71\x41\x5a\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\xf2\x80\x37\x3c\x5b\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6\xdd\x53\xe2\xb4\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\xa8\x0d\x1e\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\x2b\x6f\xf7\x2a\x70";
echo md5($data1);
echo "\n";
echo md5($data2);
echo "\n";
echo "79054025255fb1a26e4bc422aef54eb4";
首先md5并没有说字符超过多少之后自动截断,比如超过100个字符之后,只获取前面100个字符计算md5值。
md5不论怎么算,都是32位,也就是用有穷的md5值表示无穷的数据。怎么可能保证不一样的md5.但是概率也是很小的。
网上没有给出最短字符md5后值一样,但具有相同md5值的例子,都是很长字符串或者文件啥的。
Md5在实际中的用途?
软件的官网都会提供这个文件的MD5,用来校验下载下来的md5是不是和官方提供的一致,如果不一致,文件肯定被篡改了,如果一致,并不一定说明没有篡改。可以在增加一个sha1。都一样的概率更低了就。
用于密码加密,列如,明文密码admin,使用md5得出21232f297a57a5a743894a0e4a801fc3,并保存的数据库,当用户登录时,再次使用md5算出登录提交的密码,和数据库中的密码进行校验。后续有的增加一个salt来做干扰。增加通过枚举反向推导出来的难度。不同字符串md5后值有可能一样,所以这里并不是100%安全。
用来接口数据签名,客户端和服务端协定一个长串秘钥,然后sign=md5(消息内容+秘钥),接口传输数据里面不能有秘钥,防止被截获。只传入签名和消息内容,一旦有人截获消息内容,篡改之后在发送出去后,sign参数就校验不过去了,证明消息被篡改过不可信了。极端情况有可能篡改之后的消息,服务端再次md5和之前签名一致。
版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。
本文链接:md5详细说明 - https://wlphp.com/?post=362