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操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
python 换位密码算法的实例详解
Jul 19 Python
python 删除非空文件夹的实例
Apr 26 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
快速排序的四种python实现(推荐)
Apr 03 Python
python查看文件大小和文件夹内容的方法
Jul 08 Python
Django REST framework 视图和路由详解
Jul 19 Python
python3调用windows dos命令的例子
Aug 14 Python
如何在python中执行另一个py文件
Apr 30 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
python百行代码实现汉服圈图片爬取
Nov 23 Python
python实现简单的三子棋游戏
Apr 28 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python使用turtle库绘制树
2018/06/25 Python
Python生成器generator原理及用法解析
2020/07/20 Python
关于Python错误重试方法总结
2021/01/03 Python
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
装饰资料员岗位职责
2013/12/30 职场文书
会议开场欢迎词
2014/01/15 职场文书
给儿子的表扬信
2014/01/15 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
临床护理求职信
2014/04/26 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
婚前保证书范文
2015/02/28 职场文书
英语投诉信范文
2015/07/03 职场文书
暑期家教宣传单
2015/07/14 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
Python源码解析之List
2021/05/21 Python
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python