python(Werkzeug散列密码)

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

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

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

案例:将用户的密码属性值改为散列值
class User(db.Model):

    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    username=db.Column(db.String(50),unique=True,index=True,nullable=False)
    # gender=db.Column(db.SmallInteger,default=1)
    # age=db.Column(db.SmallInteger)
    # password=db.Column(db.String(20),nullable=False)
    password_hash=db.Column(db.String(200),nullable=False)
    email=db.Column(db.String(20),unique=True,index=True,nullable=False)
    time=db.Column(db.DateTime,default=datetime.now())
    role_id=db.Column(db.Integer,db.ForeignKey('role.id'))
    def __repr__(self):
        return '<User %s>' %(self.username)

    # 将password这个方法装饰成属性,当获取这个属性时就是调用这个方法
    @property
    def password(self):
        raise AttributeError('密码不可读')


    # 当设置password这个属性的值时,所做的一系列操作:
    # 将密码通过哈希函数计算出散列值并保存在数据库中
    @password.setter
    def password(self,password):
        self.password_hash=generate_password_hash(password)


    def check(self,password):
        return check_password_hash(self.password_hash,password)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值