写点什么

架构师系列 12 单向散列加密算法对用户密码加密

用户头像
桃花原记
关注
发布于: 2021 年 01 月 03 日

单向散列函数(也称杂凑函数、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 代码例子


def checkPW(user, pwd, pwdhased): md5 = hashlib.md5() md5.update((user + pwd + "salt-a").encode()) print(md5.hexdigest()) if pwdhased == md5.hexdigest(): print("correct password") return True else: print("in-correct password") return False
if __name__ == "__main__": checkPW("user", "pwd", "86a7928bb38284b74cb47a882fbedf91") checkPW("user", "pwo", "86a7928bb38284b74cb47a882fbedf91")
复制代码

执行结果:


86a7928bb38284b74cb47a882fbedf91correct passworda5335941df683d1796cb751d30f89c4din-correct password
复制代码


用户头像

桃花原记

关注

还未添加个人签名 2018.11.24 加入

还未添加个人简介

评论

发布
暂无评论
架构师系列 12 单向散列加密算法对用户密码加密