MD5是什么?及其它的特点
⽐较官⽅的解释⼤家可以百度,这⾥我说⼀下⾃⼰的理解。
⼀.作⽤:⼀般⽤于互联⽹⼀种数据的唯⼀性标识。
⼆.实体:本⾝是⼀个128位的0/1⽐特。⼀般被表⽰为16进制的字符串。4个⽐特位组成⼀个16进制字符,因此常常能见到的是
(128/4=)32个16进制字符组成的字符串4951dd1cbff8cbbe4cd4475ca939fc8b,当然它实质是⼀种消息摘要算法
三.特点:
1.完全相同的⼀段数据,不论时间地点(加密算法相同的条件)加密出的32位的字符串完全相同。
2.加密过程本⾝就是⼀个有损的加密过程。因此⼏乎不能还原出原始数据。安全
补充:⼀般还原出原始数据都是使⽤碰撞的⽅式来还原。意思⼤概和穷举的意思⼀样,有⾜够多的原始数据量,世界上的所有数据⽤
1~n来表⽰,把1~n都⽤MD5计算⼀遍得1x~nx(x表⽰计算后得的数)。把1~n当成键值对的键,把1x~nx放⼊键值对的值,当得到
⼀个MD5字符串,通过值去找键,就知道是什么数据了。因为你本来就拥有数据,因此才能找到数据。但当你没有原始数据时,想通
过128⽐特的玩意去恢复⼤于128⽐特的数据本⾝就是玩笑,数据量都不⼀样,⾄于原理有兴趣的朋友可以研究研究信息论。不想研
究的可以回想回想之前学的⾹农公式。再从这⼀点去研究。⼜有⼤的世界。
3.散列能⼒巨强。安全
MD5⼯具类代码:
;
putStream;
ption;
eDigest;
publicclassMD5Utils{
publicstaticStringgetStringMD5(Stringstr){
try{
MessageDigestdigest=tance("MD5");
returnnewString(encode((es())));
}catch(Exceptione){
thrownewRuntimeException("md5digestfail:",e);
}
}
publicstaticStringgetFileMD5(Filefile){
FileInputStreamin=null;
try{
MessageDigestdigest=tance("MD5");
if(!()){
thrownewRuntimeException("md5digestfail:filenotexists!");
}
bytebuffer[]=newbyte[1024];
intlen;
in=newFileInputStream(file);
while((len=(buffer,0,1024))!=-1){
(buffer,0,len);
}
returnnewString(encode(()));
}catch(Exceptione){
thrownewRuntimeException("md5digestfail:",e);
}finally{
if(in!=null){
try{
();
}catch(IOExceptione){
}
}
}
}
privatestaticfinalchar[]HEX={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
publicstaticchar[]encode(byte[]bytes){
finalintnBytes=;
char[]result=newchar[2*nBytes];
intj=0;
for(inti=0;i
//Charfortop4bits
result[j++]=HEX[(0xF0&bytes[i])>>>4];
//Bottom4
result[j++]=HEX[(0x0F&bytes[i])];
}
returnresult;
}
}
当以上代码加密⽂件时。即使⽂件名不同,只要⽂件内容相同,加密出的MD5完全⼀致:
测试:
加密⼀个图⽚:
;
5Utils;
publicclassMD5Test{
publicstaticvoidmain(String[]args){
//MD5第⼀次运算4951dd1cbff8cbbe4cd4475ca939fc8b
n(
eMD5(
newFile("C:")
)
);
//MD5第⼆次运算
n(
eMD5(
newFile("C:")
)
);
//MD5第三次运算
n(
eMD5(
newFile("C:UrsanxiaopeiDesktopindex⽂件名真的不同!.jpg")
)
);
//MD5第四次运算
n(
eMD5(
newFile("C:UrsanxiaopeiDesktopindex⽂件名真的不同!.jpg")
)
);
//1的MD5数为
n(
ingMD5(
"1"
)
);
}
}
结果:
对字符串1的加密,⼤家使⽤我的代码在你的机器上做了MD5运算后⼀定也能得到c4ca4238a0b923820dcc509a6f75849b
第⼀次与第⼆次加密证明了,对相同的⽂件不同的时间加密的出相同的MD5
第三四次加密与前两次相同证明在,⽂件的副本,哪怕⽂件名不⼀样,只要⽂件内容相同,加密的MD5也是相同的。
现在我们来做⼀个有趣的事。
把图⽚以记事本打开更改其中⼀个字符。再次加密图⽚(改了⼀个字符,图⽚也会打不开,不要使⽤重要图⽚做测试),这次我们更改⽂
件的副本⾥的⼀个字符。删掉添加更改都可以,随意。这次我就只改⼀个字符,把最后⼀个字符“?”删掉。
删掉“?”后我的副本都不能预览了。
⽤MD5运算后,可以看到第⼆⾏与第三⾏结果完全不⼀样,证明了它散列的能⼒。巨强!可以说百分之零点⼏的的差别也会导致MD5完全
不⼀样。因此再不考虑碰撞的可能性下,只要两个数据的MD5相同,那我们可以认为这两个数据完全相同。
说了这么多知道了它唯⼀标识的能⼒很强。
既然他的唯⼀标识能⼒这么强。
那有个使⽤场景就是,⽤来作为⽂件的唯⼀标识。⽐如⽂件上传时,哪怕你的⽂件名不⼀样,经过MD5⼀下,服务器对⽐⼀下存在服务器
的⽂件的MD5码表。就知道你上传的这个⽂件是否服务器已经存在,qq的秒传也是使⽤这个⽅法(我猜的)发现服务器有这个⽂件后,直
接把服务器那个⽂件传给你要传的⼈。如果你是上传⽂件给服务器,那你也得到⼀个访问服务器那个⽂件的权限。因为服务器知道你上传的
⽂件就是服务器存着的那个⽂件,这就是秒传的精髓。当然具体实现消息摘要算法的⽅式也许会不⼀样。也许是md其他什么的。
本文发布于:2022-11-16 04:20:27,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/28805.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |