架构师系列 12 单向散列加密算法对用户密码加密
单向散列函数(也称杂凑函数、Hash 函数)
根据输入消息计算后,输出固定长度数值的算法,输出数值也称为“散列值”或“消息摘要”,其长度通常在 128~256 位之间。
常见散列函数(Hash 函数)
MD5(Message Digest Algorithm 5):是 RSA数据安全公司开发的一种单向散列算法,MD5 被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个 128 位的数值。
SHA(Secure Hash Algorithm)这是一种较新的散列算法,可以对任意长度的数据运算生成一个 160 位的数值。
MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息,常见的是 HMAC(用于消息认证的密钥散列算法)。
CRC(Cyclic Redundancy Check):循环冗余校验码,CRC 校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。占用系统资源少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段(CRC 并不是严格意义上的散列算法,但它的作用与散列算法大致相同,所以归于此类)。
MD5
经常在网站下载软件的人会留意这样一件事儿,在下载页面,网站会提供这个下载数据包的 MD5 值。这样的一个值就是网站使用 MD5 算法对下载的目标数据进行计算得到的一个散列值。如果攻击者攻破这个网站,在给用户下载的数据包中插入一些恶意代码或病毒,那么使用 MD5 算法计算得到的 MD5 散列值肯定发生了变化。
当这些被篡改的数据包被用户下载之后,用户只要执行 MD5 算法得到下载数据包的 MD5 散列值,与网站上公布的正常的 MD5 值对比。如果 MD5 值两者不同,表示正常的数据包被篡改了,就不要使用该数据包;如果两者一致,表示数据包没有被篡改,就能放心使用该数据包。
那么攻击者必须能调整代码的其他部分,使 MD5 的输出与以前相同。但 MD5 是专门为防止这种攻击而设计的,因此任何人下载了修改过的文件后,通过检查 MD5 散列值都将发现文件已不是原来的。
Python 代码例子
执行结果:
评论