Python 摘要算法 MD5 与 SHA1 原理及实战应用
本文介绍 Python 中常用的摘要算法 MD5 和 SHA1,涵盖其原理、固定长度输出特性及 hashlib 模块的具体用法。通过代码示例演示多次 update 调用、数据篡改检测以及结合用户名的加盐存储方案,帮助开发者理解如何安全地处理数据完整性校验与密码保护。
在算法学习过程中,编程语言间的算法逻辑往往存在共通之处。掌握算法的核心在于两点:一是明确该算法的具体应用场景,二是熟悉其在特定编程语言中的实现方式。
摘要算法,也被称为哈希算法或散列算法,其核心机制是通过特定的函数,将任意长度的数据转换为固定长度的数据串,通常以 16 进制字符串形式呈现。摘要函数 f() 对任意输入数据 data 计算出固定长度的摘要 digest,主要目的是验证原始数据在传输或存储过程中是否被篡改。只要原始数据发生微小变化,计算出的摘要值就会截然不同。
目前业界常见的摘要算法主要包括 MD5 和 SHA1 两种。
MD5 算法详解
import hashlib
m=hashlib.md5()
m.update('zhangkang')
print(m.hexdigest())
输出:
09b32682a49db34d3c9d7e6d97f85a4a
当处理的数据量较大时,可以多次调用 update() 方法分批输入数据,最终生成的摘要结果与一次性输入完整数据的结果完全一致。
import hashlib
m=hashlib.md5()
m.update('zhang')
m.update('kang') #输出结果一样
print(m.hexdigest())
输出:
09b32682a49db34d3c9d7e6d97f85a4a
为了验证摘要算法对数据变化的敏感性,我们可以尝试修改原始数据中的单个字符,观察计算出的 MD5 值是否会发生显著变化。
import hashlib
m=hashlib.md5()
m.update('zhangkanf')#输出结果完全不一样,虽然只改变一个字母
print(m.hexdigest())
输出:
17d2bcf39906311768c2f363778d2801
MD5 是目前应用最广泛的摘要算法之一,其计算速度较快。该算法生成的结果固定为 128 bit 字节,通常表示为一个 32 位的 16 进制字符串。
SHA1 算法详解
import hashlib
s=hashlib.sha1()
s.update('my name is zhangkang')
print(s.hexdigest())
输出:
512e877d47cd06246b24ac99027991cbfa67aec1
SHA1 的工作机制与 MD5 类似,同样支持通过多次调用 update() 进行分块数据处理。两者的主要区别在于输出结果的长度:SHA1 生成的是 160 bit 字节,通常表示为一个 40 位的 16 进制字符串。
摘要算法的实际应用场景
在 Web 开发中,数据库常存储用户名和密码信息。若以明文形式保存密码,一旦数据库发生泄露,所有用户密码将直接暴露,造成严重的安全风险。因此,正确的做法是仅保存密码的 MD5 值,而非明文。用户登录时,系统计算输入密码的 MD5 值,并与数据库中存储的值进行比对。即便攻击者获取了 MD5 值,由于由 MD5 反推原始数据在计算上几乎不可行,因此相对安全。为了进一步提升安全性,建议在计算 MD5 时引入“加盐”机制,即在 update() 中同时加入用户名、密码及其他固定字符串,从而增加破解难度。
#模拟用户登录
import hashlib
db={
'zhangkang':'25c25c67943e82a116ec8c32218a5068',
}
#明文密码是:zhangkang123456
def login(username,password):
m=hashlib.md5()
m.update(username+password+'the-salt')
passwd=m.hexdigest()
if passwd!=db[username]:
return False
else:return True
while(True):
username=raw_input('Input username:')
password=raw_input('Input password:')
if(login(username,password)):
print('login success!')
break
else:
print('login failed!')
总结
本文详细阐述了 Python 中 MD5 和 SHA1 摘要算法的基本原理及代码实现,并通过实例展示了其在数据校验和密码存储中的应用。希望这些内容能对读者有所帮助。欢迎继续浏览本站其他技术专题,如有疏漏之处,敬请留言指正,感谢大家的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









