一、什么是MD5
MD5 (Message Digest Algorithm 5,消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数
MD5的功能,简单而言,是将一段明文作为输入,输出一串固定长度的字符串,即此段明文的签名(或摘要),并保证输入不同的明文,其输出的签名截然不同(有极低概率失效)。
二、MD5算法
MD5 算法流程
MD5的算法可以简述如下:
- 若明文长度不是512位的整数倍,则填充字符至满足此条件,然后将明文按512位的长度分块
- 设置128位的初始秘钥,一般使用算法库默认值,按照顺序对一块数据进行非线性运算,生成一个128位的结果,作为下一次计算的输入部分,依次迭代,直到最后输出一个128位的签名
三、代码实现
现有主流语言都有对应的MD5实现,在Python中Demo如下:
import hashlib
# 待加密信息
text = 'hello world'
# 创建md5对象
md5 = hashlib.md5()
#更新hash对象的值
md5.update(text.encode("utf-8"))
print('MD5 sign=:' + md5.hexdigest())
四、实际应用
情景1:服务器端密码存储
很久前安全意识还很淡薄,不少服务器密码是明文保存于数据库中的。一旦攻击者成功入侵到数据库,就直接取得账号和密码
随着时间发展,开发者认识到密码明文保存的脆弱性,采用加密保存密码。此阶段不存储用户的原始密码,而是存储其密码的签名。用户登录时只需要计算其输入密码的签名与服务器端保存的签名是否一致即可。这样,即使泄露了签名值,攻击者也无法直接得到原始的密码
情景2:消息防篡改
上面MD5的算法中初始由算法默认设置。如果直接使用的话,是不安全的。比如我发送一段消息,并将其MD5签名发送出去。但是被第三方拦截了,他修改了消息,重新进行MD5签名。那么接收方无法判断其是否消息是否被修改了
一般而言,是发送方和接收方一同约定一个密钥,在发送消息是将密钥加在消息中进行签名。第三方没有密钥,重新生成的签名是不同的
此外,有的时候会在消息后面加上一无意义的随机字符串,是得生成的MD5更加随机,不易被破解
参考链接
MD5算法原理介绍与C++实现
信息摘要算法之一:MD5算法解析及实现
Python 中 MD5 加密
谈谈密码安全:服务端密码保存