用户信息安全性设置_使用werkzeug散列密码

1. 为什么使用它?

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

2. 它是什么?

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

  • 计算密码散列值的函数接收密码作为输入,使用一种或多种加密算法转换密码,最终
    得到一个和原始密码没有关系的字符序列。
  • 核对密码时,密码散列值可代替原始密码,因为计算散列值的函数是可复现的:只要输入一样,结果就一样。

3. 用法

Werkzeug 中的 security 模块能够很方便地实现密码散列值的计算。

  • generate_password_hash(password, method= pbkdf2:sha1 , salt_length=8)
  • check_password_hash(hash, password) :
class User(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(30), unique=True)
    password = db.Column(db.String(300))
    email = db.Column(db.String(50), unique=True)  # 邮箱地址
    phone = db.Column(db.Integer, unique=True)
    face = db.Column(db.String(50), unique=True)  # 用户头像url地址
    gender = db.Column(db.Boolean)  # 性别
    comments = db.relationship('Comment', backref='user')  # 用户和评论的反向关联
    userlogs = db.relationship('Userlog', backref='user')  # 会员和会员登录日志的反向关联


    def verify_password(self, password):
        from werkzeug.security import  check_password_hash
        # 判断密码是否正确
        return  check_password_hash(self.password, password)

    def __repr__(self):
        return "<User %s>" % (self.name)

往数据库中存密码

    u = User(name='redhat', password=generate_password_hash('redhat'))

登录验证密码:

username = form.username.data
password = form.password.data
user = User.query.filter_by(name=username).first()
if user and user.verify_password(password):
	登录成功
else:
	登录失败

第二种方法:

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)
 	......

    @property
    def password(self):
        """当出现xxxx=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  "<User %s>" %(self.username)

往数据库中存密码的时候直接存即可,因为会自动调用转换密码的方法

u.password = password

猜你喜欢

转载自blog.csdn.net/qq_41386300/article/details/88726182