赞
踩
MD5,讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。
长度固定
无论输入多少,输入固定为 16 字节 ,相当于超损压缩。
不可逆
无法从结果反推原始数据。由于长度固定的特性,中间会丢掉一些信息。因此,相同数据的MD5值肯一样,不同数据的MD5值几乎不可能一样。
MD5 是摘要算法,由MD5产生的编码之于正文,正如指纹之于人一样,只要正文不变,那么摘要就不变。
因为MD5是有限多个的而原文可以是无数多个。因此,一个MD5理论上可能对应无数多个原文的。主流的MD5将 任意长度 的字节串 映射 为一个 128bit 的 大整数 ,一共有 2128 种可能,尽管这个数字是有限多个的,但是世界上可以被用来加密的原文却有无数的可能性。这就好比,只知道指纹与人的关系。
高度离散型 (抗修改性)
输出的16个字节,没有规律可言,因此结果也无法预测。同时,对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
抗碰撞性
想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。同样地,已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5算法的原理是 将输入的消息分成 512位 的 数据块 ,每个数据块 再分成 16 个 32位 的 小块,通过一系列的 位运算 和 非线性函数 ,对 每个小块 进行 处理 ,最终得到 一个 128位 的 哈希值。由于MD5算法的设计,即使输入的消息只有微小的变化,也会导致 输出的哈希值 发生巨大的变化,因此可以用来 验证 数据的完整性 和 真实性。
数据填充,即进行 补位
操作
MD5运算要用到一个128位的MD5缓存器,用来保存中间变量和最终结果。
该缓存器又可看成是4个32位的寄存器A、B、C、D,
初始化为 :
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
常见的MD5 密码存储方式:
使用哈希存储密码;
使用哈希加盐存储密码;
使用加密算法存储密码;
使用 bcrypt 存储密码;
曾经 MD5 被用于存储加密信息,但现逐步被替代 。正如它的特性—— 摘要算法,而非加密算法。本质上,可以看作是哈希函数(将无限键值空间中的所有键都均匀地映射到一个指定大小的键值空间中)。
需要明确,好的 摘要算法 能够帮助我们保证文件的完整性,避免攻击者的恶意篡改,但是 加密算法 —— 通过某种特定的方式来编码消息或者信息,只有授权方可以访问原始数据,而没有被授权的人无法从密文中获取原文。
因此,MD5 更多用在检验,而非保密。例如,上传大文件到某云盘时,会发现该文件瞬间就上传成功了,但真的是这样吗?其实是云盘将该文件的MD5 上传后与 已有的 文件形成对比,如果有相同的编码,则用已经上传成功的文件替代。
MD5 将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的 MD5 信息摘要。需要注意,这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。
MD5 将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的 MD5 信息摘要;
1、存储MD5的值应该用 varchar 还是 char ?
2、MD5属于哪种加密算法?
3、MD5、AES、RSA三者有什么区别?