zoukankan      html  css  js  c++  java
  • MD5哈希算法及其原理

     MD5算法介绍。


    MD5消息摘要算法(MD5 Message-Digest Algorithm),是在计算机领域被广泛使用的一种哈希算法,用来对信息进行完整性保护。它由美国密码学家Ronald Linn Rivest设计,于1992年公开,用以取代MD4算法。它的规范为RFC 1321。


    MD5将一个任意长度的数据经过编码得到一个128位(16字节)的哈希值,即为MD5值。


    01

    MD5功能


    MD5算法对任意长度的消息输入,产生一个128位(16字节)的哈希结构输出。在处理过程中,以512位输入数据块为单位。


    02


    MD5用途及特征


    MD5通常应用在以下场景:

    1、防篡改,保障文件传输可靠性

    如SVN中对文件的控制;文件下载过程中,网站提供MD5值供下载后判断文件是否被篡改;BT中对文件块进行校验的功能。


    2、增强密码保存的安全性。

    例如网站将用户密码的MD5值保存,而不是存储明文用户密码,当然,还会加SALT,进一步增强安全性。


    3、数字签名

    在部分网上赌场中,使用MD5算法来保证过程的公平性,并使用随机串进行防碰撞,增加解码难度。


    MD5算法具有以下特点:

    1、压缩性

    任意长度的数据,算出的MD5值长度都是固定的。


    2、易计算

    从原数据计算出MD5值很容易。


    3、抗修改性

    对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。


    4、强抗碰撞

    已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。


    03


    MD5算法过程


    网络中很容易找到MD5算法的相关实现代码,这里就不列出了。我们只需要关心它的实现框架即可。


    第一步:消息填充

    补长到512的倍数 

    最后64位为消息长度(填充前的长度)的低64位

     一定要补长(64+1~512),内容为100…0(如若消息长448,则填充512+64)


    第二步 :分割

    把结果分割为512位的块:Y0,Y1,…(每一个有16个32比特长字) 


    第三步 :计算

    初始化MD buffer,128位常量(4个32bit字),进入循环迭代,共L次 

    每次:一个输入128位,另一个输入512位,结果输出128位,用于下一轮输入 


    第四步:结果

    最后一步的输出即为散列结果128位。



    04


    MD5安全性


    MD5虽然被广泛应用,但仍存在弱点,可以被加以破解,MD5算法无法防止碰撞,并已有碰撞成功案例。对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2等。


    另外,如果一个网站使用MD5进行用户名和密码的保存,请记住,一定要加SALT,不然,和明文保存差不多,基本无安全性可言。


    目前互联网上已经有很多字符串与MD5的数据库,基本上可以认为没有加SALT的MD5值类似于裸奔了。


    05


    MD5工具


    进行MD5的计算,有很多工具可供使用,如本公众号之前的文章《Fiddler使用技巧:强大的数据文本编解码功能》介绍的Fiddler的TextWizard功能,还有各种可以计算文件MD5值的工具。


    在网上有许多在线的MD5计算网站,如chinaz的http://tool.chinaz.com/tools/md5.aspx


    在MD5的逆向工具方面,也有不少网站提供MD5值的查询,可以根据MD5值反查字符串,这些网站,收集了大量字符串的MD5值,在根据密码的MD5查询字符串时很有用。

    640?wx_fmt=png

    如国内的:

    http://www.cmd5.com/

    http://www.xmd5.org/

    国外的:

    https://md5online.org/

    http://md5decrypt.net/

    在一个网站查询不到结果时,多试几个网站,另外,根据使用经验,国外的几个网站查询效果比国内的好。


    对MD5的爆破有心得体会,请联系我分享。

    640?wx_fmt=jpeg

    长按进行关注。





  • 相关阅读:
    [leetcode]算法题目
    JQuery功能查询页
    [C语言]一个很实用的服务端和客户端进行TCP通信的实例
    Siege——多线程编程最佳实例
    CodeIgniter框架中关于URL(index.php)的那些事
    web压测工具http_load原理分析
    【JAVA】文件各行打乱
    【JAVA】HashMap的原理及多线程下死循环的原因
    【JAVA】高并发优化细节点
    【Linux】日志分析工具grep sed sort
  • 原文地址:https://www.cnblogs.com/protosec/p/11673347.html
Copyright © 2011-2022 走看看