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 httplib,smtplib使用方法
Sep 06 Python
基于python时间处理方法(详解)
Aug 14 Python
Django admin美化插件suit使用示例
Dec 12 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
python将txt文件读入为np.array的方法
Oct 30 Python
pyqt5实现登录界面的模板
May 30 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
python 爬取小说并下载的示例
Dec 07 Python
pip install命令安装扩展库整理
Mar 02 Python
如何判断pytorch是否支持GPU加速
Jun 01 Python
详细介绍python操作RabbitMq
Apr 12 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序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
python登录QQ邮箱发信的实现代码
2013/02/10 Python
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
Python创建字典的八种方式
2019/02/27 Python
Python魔法方法功能与用法简介
2019/04/04 Python
Python新手学习装饰器
2020/06/04 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
党员岗位承诺口号大全
2014/03/28 职场文书
高中生操行评语大全
2014/04/25 职场文书
团日活动总结范文
2014/04/25 职场文书
应届大学生自荐书
2014/06/17 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
JavaScript函数柯里化
2021/11/07 Javascript