是什么
给定任意长度数据生成定长的密文;
md5 输出 32 hex 字符
sha1 输出 40 hex 字符
sha256 输出 64 hex 字符
摘要结果不可逆, 不能通过密文还原出原数据;
破解 1: 彩虹表, 提前生成的简单密码表摘要.
破解 2: 对密文进行碰撞; 构造一个输入, 产生和密文一样的摘要, 从而发现原文.
解决: 加盐提高破解难度.
有什么用
通常用来做 数据完整性验证 或 加密用户密码.
加密用户密码时, 存储在数据库的是密文; 由于不可逆, 所以密码不能找回, 只能重置.
加密用户密码时, 加盐提高破难度.
例子
1. 一次摘要
- import hashlib
- m = hashlib.md5(badi)
- log(m.hexdigest()) # c46335eb267e2e1cde5b017acb4cd799
- s = hashlib.sha1(badi)
- log(s.hexdigest()) # b3e8ff7ac1c7e75661e16152a5dce1ff36a3e140
2. 加 salt
- def salted_password(password, salt):
- def md5hex(text):
- return hashlib.md5(text.encode(ascii)).hexdigest()
- hash1 = md5hex(password + salt)
- return hash1
3. 加 salt 和 连续加密并用
- def salted_password(password, salt):
- def md5hex(text):
- return hashlib.md5(text.encode(ascii)).hexdigest()
- def sha1hex(text):
- return hashlib.sha1(text.encode(ascii)).hexdigest()
- hash1 = md5hex(password)
- hash2 = sha1hex(hash1 + salt)
- return hash2
摘要算法
来源: http://www.bubuko.com/infodetail-2530547.html