python中使用加盐哈希函数加密密码

栏目: 编程工具 · 发布时间: 7年前

内容简介:开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种本篇文章主要介绍第四种 「加盐哈希加密」Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。但是 werkzeug 不是一个 web 服务器,也不是一个 web 框架,而是一个工具包,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等,大名鼎鼎的Flask就是基于werkzeug开发的。

开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种

  • 明文存储:肉眼就可以识别,没有任何安全性。 谁用谁傻缺
  • 加密存储:通过一定的变换形式,使得密码原文不易被识别。密码加密的几类方式:
  1. 明文转码加密:BASE64, 7BIT等,这种方式只是个障眼法,不是真正的加密。

  2. 对称算法加密:DES, RSA等。

  3. 签名算法加密:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容 易被暴力破解。如果密码相同,得到的哈希值是一样的。

  4. 加盐哈希加密:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使 密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运 用这种加密方法

本篇文章主要介绍第四种 「加盐哈希加密」

werkzeug介绍

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。但是 werkzeug 不是一个 web 服务器,也不是一个 web 框架,而是一个 工具 包,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等,大名鼎鼎的Flask就是基于werkzeug开发的。

安装 werkzeug

pip install Werkzeug 

密码生成函数 generate_password_hash

>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash('123')
'pbkdf2:sha256:50000$fESwY4Cl$38fdf741069ef37c207211b9bee69514582dc366660563d75c00e7cbfd7cbd8a'
>>> generate_password_hash('123')
'pbkdf2:sha256:50000$hUhR8Gr3$73d44814d5cd490c04e0559141fb327c31766a0314d82ee05e33c33e1559af78'
>>> generate_password_hash('123')
'pbkdf2:sha256:50000$EDHR93sZ$0d72a4c15a1c07b03f4190c7ac30b48ae8b478a4977a0262fa16d38417450b21'
>>> generate_password_hash('123')
'pbkdf2:sha256:50000$ntpFkKsc$bd062cd0b35c5b26c91242fc72eb0e889cf71b9dd4c1ae291587a7a3e84db293'
>>> generate_password_hash('123')
'pbkdf2:sha256:50000$sVP5IXJG$b93a86f5343d2a243ec701bfdf0cff745a5b1532c66cb7f82fb7d252d3b5ffb0'

可以看到,每次计算出来的值都是不一样的, generate_password_hash 函数定义为

generate_password_hash(password, method='pbkdf2:sha256', salt_length=8)

password 为明文密码

method 哈希的方式,格式为 pbpdf2:<method> 主要有sha1,sha256,md5

salt_length 盐值的长度,默认为8

>>> generate_password_hash('123',method='pbkdf2:sha1',salt_length=10)
'pbkdf2:sha1:50000$4GUBRzzizn$45b0f6b84a4ca4352b45feea8283fc48186f9ee8'
>>> generate_password_hash('123',method='pbkdf2:sha1',salt_length=8)
'pbkdf2:sha1:50000$4kHPpS9R$1f87c09c052342fd0d65b75aa70ababb1c17e7df'
>>> generate_password_hash('123',method='pbkdf2:md5',salt_length=8)
'pbkdf2:md5:50000$zppMHqux$01acb41e0b2858bbc849abf77692a9c0'
>>> generate_password_hash('123',method='pbkdf2:md5',salt_length=8)
'pbkdf2:md5:50000$rMaQutjR$1cc67c05e063cec0c8e5f8e048ddb5e1'

密码验证函数:check_password_hash

有生成函数就得有相应的解密函数, check_password_hash 的定义为

check_password_hash(pwhash, password)

pwhash 为密文

password 为明文

相同则返回 True ,不同返回 False

>>> check_password_hash('pbkdf2:sha256:50000$ntpFkKsc$bd062cd0b35c5b26c91242fc72eb0e889cf71b9dd4c1ae291587a7a3e84db293','123')
True
>>> check_password_hash('pbkdf2:sha256:50000$ntpFkKsc$bd062cd0b35c5b26c91242fc72eb0e889cf71b9dd4c1ae291587a7a3e84db293','1234')
False

结语

这个加盐哈希加密以后的密文,放到另外一台服务器上也是可以校验通过的,如果做网站数据库迁移也不用重新生成数据,使用这套加密算法可以很大程度上规避暴力破解密码,还是那名老话,密码是123456的就算使用再牛逼的加密你依然是不安全的,另外撞库也是不可避免的,所以作为用户可以尝试不同的网站使用不同的密码来规避撞库问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Computation and Programming Using Python

Introduction to Computation and Programming Using Python

John V. Guttag / The MIT Press / 2013-7 / USD 25.00

This book introduces students with little or no prior programming experience to the art of computational problem solving using Python and various Python libraries, including PyLab. It provides student......一起来看看 《Introduction to Computation and Programming Using Python》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具