摘要算法

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

 

posted @ 2021-01-29 17:07  cheng4632  阅读(778)  评论(0编辑  收藏  举报