Flask框架中密码的加盐哈希加密和验证功能的用法详解


Posted in Python onJune 07, 2016

密码加密简介
密码存储的主要形式:

  • 明文存储:肉眼就可以识别,没有任何安全性。
  • 加密存储:通过一定的变换形式,使得密码原文不易被识别。

密码加密的几类方式:

  • 明文转码加密:BASE64, 7BIT等,这种方式只是个障眼法,不是真正的加密。
  • 对称算法加密:DES, RSA等。
  • 签名算法加密:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容
  • 易被暴力破解。如果密码相同,得到的哈希值是一样的。
  • 加盐哈希加密:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运用这种加密方法。
  • 密码生成函数:generate_password_hash

函数定义:

werkzeug.security.generate_password_hash(password, method='pbkdf2:sha1', salt_length=8)

generate_password_hash是一个密码加盐哈希函数,生成的哈希值可通过
check_password_hash()进行验证。

哈希之后的哈希字符串格式是这样的:

method$salt$hash

参数说明:

  • password: 明文密码
  • method: 哈希的方式(需要是hashlib库支持的),格式为
  • pbpdf2:<method>[:iterations]。参数说明:
  • method:哈希的方式,一般为SHA1,
  • iterations:(可选参数)迭代次数,默认为1000。
  • slat_length: 盐值的长度,默认为8。

密码生成示例:

>>> from werkzeug.security import generate_password_hash
>>> print generate_password_hash('123456')
'pbkdf2:sha1:1000$X97hPa3g$252c0cca000c3674b8ef7a2b8ecd409695aac370'

因为盐值是随机的,所以就算是相同的密码,生成的哈希值也不会是一样的。

密码验证函数:check_password_hash
函数定义:

werkzeug.security.check_password_hash(pwhash, password)

check_password_hash函数用于验证经过generate_password_hash哈希的密码
。若密码匹配,则返回真,否则返回假。

参数:

  • pwhash: generate_password_hash生成的哈希字符串
  • password: 需要验证的明文密码

密码验证示例:

>>> from werkzeug.security import check_password_hash
>>> pwhash = 'pbkdf2:sha1:1000$X97hPa3g$252c0cca000c3674b8ef7a2b8ecd409695aac370'
>>> print check_password_hash(pwhash, '123456')
True

举例说明

from werkzeug.security import generate_password_hash, \
   check_password_hash

class User(object):

  def __init__(self, username, password):
    self.username = username
    self.set_password(password)

  def set_password(self, password):
    self.pw_hash = generate_password_hash(password)

  def check_password(self, password):
    return check_password_hash(self.pw_hash, password)

下面来看看是怎么工作的:

>>> me = User('John Doe', 'default')
>>> me.pw_hash
'sha1$Z9wtkQam$7e6e814998ab3de2b63401a58063c79d92865d79'
>>> me.check_password('default')
True
>>> me.check_password('defaultx')
False

小结
上面就是密码生成和验证的方法,一般来说,默认的加密强度已经足够了,如果需
要更复杂的密码,可以加大盐值长度和迭代次数。

Python 相关文章推荐
python连接池实现示例程序
Nov 26 Python
Python通过websocket与js客户端通信示例分析
Jun 25 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Django中使用Celery的方法示例
Nov 29 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
Python批量将图片灰度化的实现代码
Apr 11 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
Python生成器generator原理及用法解析
Jul 20 Python
python 实现学生信息管理系统的示例
Nov 28 Python
Python time库的时间时钟处理
May 02 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 #Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 #Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 #Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 #Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 #Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 #Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 #Python
You might like
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python实现一个简单的验证码程序
2017/11/03 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
护理职业应聘自荐书
2013/09/29 职场文书
初中女生自我鉴定
2013/12/19 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
大学新学期计划书
2014/04/28 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis
python APScheduler执行定时任务介绍
2022/04/19 Python