我正在参加「掘金·启航计划」
今天准备自测前两天改过的缺陷,在准备登录时,才发现我注册的用户,密码忘记了。然后我跑到数据库中想找点线索,但数据库中密码是已经经过加密了的,我又跑到项目代码中,看了一会儿发现密码是经过MD5加密的,然后发现自己对MD5加密了解也不是很深,趁机学习一波~
MD5加密概念
MD5,消息摘要算法,属于 Hash 算法的一类。MD5算法对输入任意长度的消息进行运行,生成一个 128 位、16字节的消息摘要(以16进制输出,长度为32位的数字字母混合码)。
MD5特点
- 长度固定(无论输入多少字节,最终输出总是16字节);
- 不可逆(从结果无法反推出原始数据);
- 具有高度的离散性(输出的16字节数据没有任何规律,结果无法预测);
- 抗碰撞性(在原始数据固定的情况下,几乎不会出现两个数据的MD5值相同);
MD5原理
1、数据填充
对消息进行数据填充,使消息的长度对 512 取模 得 448。假设消息的长度为 x,则应该满足 x mod 512 = 448 根据这个公式得出需要填充的数据长度。填充方法:在消息后面进行填充,填充第一位为1,其余为0。(此时消息的长度为 N * 512 + 448)
2、添加消息长度
在第一步结束之后再填充上原消息得长度,可用来进行的存储长度为 64 位。如果消息长度大于 264,则只使用其低 64 位的值,即,消息长度对 264 取模。在此步骤进行完毕后,最终的消息长度是 512 的整数倍。(此时消息的长度为 (N + 1) * 512)
3、数据处理
首先需要用到 4 个常数: 四个 32 位变量初始化(经过研究所得,是固定值)
A = 0x01234567
B = 0x89ABCDEF
C = 0xFEDCBA98
D = 0x76543210
它们被称为链接变量(chaining variable)
以上为标准的幻数的(物理顺序) 如果在程序中(小端模式)定义应该是:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
时间原因,先介绍到这里,下次接着,下次主要分析一下MD5加密的原理以及为什么MD5加密是不可逆的,但有些网站还是可以“破解”(我这次找回密码就是在网站上输入加密后的密文之后,网站给我反推出来的 0.0)
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!