python学习笔记(werkzeug散列密码)

为什么使用werkzeug散列密码?

  • 设计 Web 程序时,人们往往会高估数据库中用户信息的安全性。
  • 大多数用户都在不同的网站中使用相同的密码,获得密码之后, 访问用户在其他网站中的账户。

散列密码是什么?

用户密码的安全,关键在于不能存储密码本身,而要存储密码的散列
值。

怎么使用werkzeug散列密码?

  • 计算密码散列值的函数接收密码作为输入,使用一种或多种加密算法转换密码,最终
    得到一个和原始密码没有关系的字符序列。
  • 核对密码时,密码散列值可代替原始密码,因为计算散列值的函数是可复现的:只要输入一样,结果就一样。
  • Werkzeug 中的 security 模块能够很方便地实现密码散列值的计算。
# 生成密码的散列值
# password:被加密的密码, method:加密方式,salt_length:安全性,长度越长,安全性越高
generate_password_hash(password, method= pbkdf2:sha1 , salt_length=8) 
# 判断密码是否正确
# hash:散列值,password:查询的密码,
check_password_hash(hash, password) :

python学习笔记(werkzeug散列密码)_第1张图片

示例

class User(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    username = db.Column(db.String(20), unique=True)
    password_hash = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(30), unique=True)
    add_time = db.Column(db.DateTime, default=datetime.now()) # 账户创建时间
    # 1).  User添加属性todos; 2). Todo添加属性user;
    todos = db.relationship('Todo', backref="user")
    categories = db.relationship('Category', backref='user')

    @property
    def password(self):
        """u.password"""
        raise  AttributeError("密码属性不可以读取")

    @password.setter
    def password(self, password):
        """u.password = xxxxx """
        self.password_hash = generate_password_hash(password)


    def verify_password(self, password):
        """验证密码是否正确"""
        return  check_password_hash(self.password_hash, password)

    def __repr__(self):
        return  "" %(self.username)

你可能感兴趣的:(笔记)