1. 介绍
MD5算法是一个用来将输入的任意长度的一组字符串生成固定128位(16字节用16进制表示是32位)哈希值摘要的哈希算法
2. 哈希算法
哈希算法比如MD5算法,指将任意长度的一组输入数据计算得到一个固定长度的输出摘要。
而哈希算法计算用的是哈希函数来作为一种函数关系
哈希函数指将哈希表中元素的关键键值映射为元素存储位置的函数。
哈希表是一种数据结构,其数据的键值和其存储位置有着一定关系,通过这种关系根据数据键值可以快速查找到数据所在存储位置。
这种关系是函数关系,函数是哈希函数,哈希函数将哈希表中元素的关键键值映射为元素存储位置。
简单来说,就是它可以将一个选取范围大的数映射到一个固定小范围(如128位)的数,并且可以直接根据键值索引到数据的位置,但是哈希函数是有缺陷的,它会有哈希碰撞即选取范围大的两个数有可能映射同一个小范围的数,这样数据存储的位置将会重复。
若关键字为k,则其值存放在 f (k)的存储位置上,对不同的关键字可能得到同一哈希地址,即k1 ≠ k2,而f(k1) = f(k2),这就是哈希碰撞。
散列函数 - 维基百科,自由的百科全书 (wikipedia.org)
3. 特点
- 不可逆转性
准确来说 MD5加密解密是不存在的,因为正如前面所说,哈希算法都是得到一个固定长度的输出摘要,而哈希函数又不能保证将每个值都存储到唯一的不会发生碰撞的位置,你只能通过将你认为是密码的哈希一下看下结果是不是跟其哈希值一样,即使一样你也不能证明这就是密码,除非你拿去登录试试,但这不符合加密解密的定义
所以经过MD5等哈希算法加密后的字段当你去解密的时候你不能确保它是原来的模样,这也是为什么网站找回密码功能只会让你重置密码而不是告诉你之前的密码是什么即使它问你之前用过什么密码也是拿去处理一下看下哈希值是否一样。
- 安全漏洞
可以被穷举就是暴力破解,虽然可以通过加盐的方法改善,但逐渐被更新的加密方法代替
什么是加密?它的工作原理是什么? | Google Cloud
4. 加盐
加盐就是在原有密码基础上插入一段特定的字符串使哈希出来的哈希值跟原有的不同。
有加静态盐(固定值)和动态盐的
What is MD5 Salt and How to Use It? | by alireza goodarzi | Medium
5. 补充
彩虹表是类似某个哈希算法的速算表
2004年,王小云破解了MD5算法,其实准确说是给出MD5碰撞攻击的理论,因为只要出来的哈希值一样,我就可以伪造数字签名那些了。