MD5

MD5是一种消息摘要算法,可以产生出一个哈希值,通常时128位(16字节)的二进制数(32位16进制数),用于验证信息传输是否被修改。

实际上MD5并不能看成一个严格意义上的加密算法,因为md5是没有正规的解密途径的。

MD5通常作为处理请求数据,用来生产密钥,作为数字签名使用。

特性#

MD5 有两个特性:

  1. 输入任意长度的内容,都会被处理成一段唯一的32位16进制哈希值;
  2. MD5是不可逆的,一旦生成后,一般不能被反推出输入内容.(实际上随着技术的反正,通过撞库和彩虹表之类的方法是可以反推的)

场景例子#

老师准备将自己在家批改玩的试卷成绩传给学校的服务器,但是为了避免有不法的学生通过网络修改成绩以应付家长,所以采用了一种方案。

1. 首先,老师将学生的的分数,用一种和学习约定的拼接规则,拼成一个字符串,并用对其使用MD5加密,生产一个Sign(密钥)

Sign = MD5( 学校提供的一串KeyCode + 学生的相关信息 + 学生的成绩 + 老师的编号 )

  1. 将相关用于生产Sign的参数和密钥一起发送给学校后台

请求参数:

1
2
3
4
5
6
7
8
> 	params = {
keyCode: d8adasd9,
studentInfo: wangxiaoming,
mark: 40,
teacher: 007,
sign: qkfisnfl0s873skvodn8c0c6asa61ijn7
}
>

  1. 学校收到请求后,将获得参数按照之间的约定生成一个Sign,然后用这个Sign和老师传过来的Sign做比较,如果完全一致,则表示中途没有被修改,如果不一致,则说明参数有修改,这个数据是不安全的数据.
    这过程一般叫做验签

原理#

  • 填充原文
  • 设置初始值
  • 循环加工
  • 拼接结果

填充原文#

原文长度(bit)对512求余,如果不等于448,就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1,其余位填充0。填充完后,信息的长度就是512*N+448。

之后,用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。这样处理后的信息长度就是512*(N+1)。

设置初始值#

MD5的哈希结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。

MD5的官方实现中,A、B、C、D的初始值如下(16进制):

  • A = 0x01234567

  • B = 0x89ABCDEF

  • C = 0xFEDCBA98

  • D = 0x76543210

循环加工#

哈希值的四个分组。每一次循环都会让旧的ABCD产生新的ABCD。一共进行多少次循环由处理后的原文长度(512 x N)决定.

则:

  1. 处理后的原文长度 = M
  2. 主循环次数 = M / 512
  3. 每个主循环中包含 512 / 32 * 4 = 64 次 子循环。

循环中使用的函数:

  • F(X, Y, Z) =(X&Y) | ((~X) & Z)
  • G(X, Y, Z) =(X&Z) | (Y & (~Z))
  • H(X, Y, Z) =X^Y^Z
  • I(X, Y, Z)=Y^(X|(~Z))

在主循环下面64次子循环中,F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。

拼接结果#

这一步就很简单了,把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可。

现实#

实际上,随着撞库,彩虹表等方式的兴起,MD5 变得越来越不安全了,所以现阶段我们开发除了 MD5 外,SHA1 也变得的越来越常用了。

但是在安全要求高的场合还是最好不要使用MD5

参考#

漫画:什么是MD5算法?

MD5值算法原理

MD5-wiki

CocosCreator本地储存 - cc.sys.localStorage 小狗钱钱

Comentarios

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×