摘要算法
1、摘要算法
数据库里保存的用户密码不应该是明文,是经过算法加密后的密文
摘要算法:又称哈希算法、散列算法,它通过一个函数,把任意长度的数据转换为一个长度固定的数据串
摘要结果是不可逆的,不能被还原为原数据
常见的摘要算法:md5, sha1
import hashlib pwd = 'cc'.encode('ascii') m = hashlib.md5(pwd) print(m.hexdigest())#c9c1ebed56b2efee7844b4158905d845 s = hashlib.sha1(pwd) print(s.hexdigest())#bdb480de655aa6ec75ca058c849c4faf3c0f75b1
2、加盐算法
假如用户使用简单密码, 破解者可以用提前生成的简单密码摘要表(彩虹表)来破解原文,
所以我们会存储一个额外的信息, 扰乱用户的简单密码
# 生成一个带盐的密文 def salted_password(password, salt): def md5hex(ascii_str): return hashlib.md5(ascii_str.encode('ascii')).hexdigest() hash1 = md5hex(password) hash2 = md5hex(hash1 + salt) return hash2
3、这样在注册时保存的是加密后的密码,验证登录时也是验证加密后的密码
def salted_password(self, password, salt='kjfe**23lkf@@ii'): def sha256(ascii_str): return hashlib.sha256(ascii_str.encode('ascii')).hexdigest() hash1 = sha256(password) hash2 = sha256(hash1 + salt) return hash2 def validate_register(self): pwd = self.password self.password = self.salted_password(pwd) if User.find_by(username=self.username) is None: self.save() return self else: return None def validate_login(self): u = User.find_by(username=self.username) if u is not None: return u.password == self.salted_password(self.password) else: return False