是什么
给定任意长度数据生成定长的密文;
md5
输出32 hex字符sha1
输出40 hex字符sha256
输出64 hex字符
摘要结果不可逆,不能通过密文还原出原数据;
- 破解1: 彩虹表, 提前生成的简单密码表摘要.
- 破解2: 对密文进行碰撞; 构造一个输入,产生和密文一样的摘要,从而发现原文.
- 解决: 加盐提高破解难度.
有什么用
- 通常用来做 数据完整性验证 或 加密用户密码.
- 加密用户密码时, 存储在数据库的是密文; 由于不可逆, 所以密码不能找回, 只能重置.
- 加密用户密码时, 加盐提高破难度.
例子
1. 一次摘要
import hashlib
m = hashlib.md5(b‘adi‘)
log(m.hexdigest()) # c46335eb267e2e1cde5b017acb4cd799
s = hashlib.sha1(b‘adi‘)
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