开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种 - 明文存储:肉眼就可以识别,没有任何安全性。 谁用谁傻缺 - 加密存储:通过一定的变换形式,使得密码原文不易被识别。密码加密的几类方式:

  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的就算使用再牛逼的加密你依然是不安全的,另外撞库也是不可避免的,所以作为用户可以尝试不同的网站使用不同的密码来规避撞库问题。

参考文章 Flask加盐密码生成和验证函数

更多文章请点击查看我的个人博客

杨彦星 | 序语程言​www.yangyanxing.com

也欢迎关注我的个人公众账号 序语程言

sha256加密_python中使用加盐哈希函数加密密码相关推荐

  1. 一个简单的方式搞定密码的加盐哈希与验证

    过去一段时间来, 众多的网站遭遇用户密码数据库泄露事件.层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家 "暴库",全部遭殃. 单向加密 一 ...

  2. 浅谈MD5加密算法中的加盐值(SALT)

    我们知道,如果直接对密码进行散列,那么***可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法, ...

  3. 加盐哈希-Salted Password Hashing

    (译文:http://blog.jobbole.com/61872/ (中文) 原文:https://crackstation.net/hashing-security.htm (英文) 个人推荐英文 ...

  4. 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

    RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网 ...

  5. java md5加盐与解密_md5加密,md5加盐加密和解密

    packagecom.java.test;importjava.security.MessageDigest;importjava.security.SecureRandom;importjava.u ...

  6. MD5加密算法中的加盐值 ,和彩虹表攻击 防止彩虹表撞库

    一.什么是彩虹表? 彩虹表(Rainbow Tables)就是一个庞大的.针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码.越是复 ...

  7. python中setattr用法_python中hasattr()、getattr()、setattr()函数的使用

    引言: 在阅读源码时,有很多简写的形式,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr().getattr().setattr()函数的使用也一并学习了 ...

  8. python中all函数的用法_python中map、any、all函数用法分析

    这篇文章主要介绍了 python 中 map . any . all 函数用法 , 实例分析了 map . any . all 函数 的相关使用技巧 , 具有一定参考借鉴价值 , 需要的朋友可以参考下 ...

  9. python中time库是什么意思_python中time库的time.time()函数的作用是什么

    python中time库的time.time()函数的作用是什么? 作用:Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数). time()方法语法:time. ...

最新文章

  1. 数学分析高等代数考研试题荟萃[更新至2017年10月1日]
  2. 玩转iOS开发:《iOS设计模式 — 单例模式》
  3. 008_Spring Data JPA原生SQL
  4. Anordighos手绘休闲脚本字体
  5. 龙格库塔法matlab求解微分方程组,微分方程组的龙格库塔公式求解matlab版.pdf
  6. MapReduce关系代数运算
  7. MySQL子查询操作实例详解
  8. 戴尔win10插耳机还外放_通州附近戴尔笔记本电脑维修哪家强-北京信维佳业科技有限公司...
  9. FPGA设计的常用思想与技巧(转)
  10. 输入一个英文句子,翻转句子中单词的顺序 例如输入“I am a student.”,则输出“student. a am I”。
  11. Java RandomAccessFile getFilePointer()方法与示例
  12. android:ellipsize省略文字用法(转载)
  13. LeetCode 404 左叶子之和
  14. maven-聚合与继承
  15. NetMeeting的使用
  16. AB PLC仿真过程
  17. Cherry键盘外接Mac command按键失灵
  18. 【华为机试真题 Python实现】竖直四子棋
  19. Springboot 使用 sendgrid发送邮件
  20. 亚马逊英国站小风扇UKCA认证办理流程

热门文章

  1. 经济学本科计算机硕士,2021考研,关于经济学专业,学硕与专硕差别到底有多大?...
  2. python编程简易打字评分小游戏
  3. Java异常处理简单实例
  4. 可信!Rancher容器解决方案通过可信云认证
  5. 前端常见手写面试题合集
  6. 执行RMAN恢复的高级场景_执行灾难恢复(Disaster Recovery)
  7. Doctype作用?严格模式与混杂模式如何区分?它们有何意义?
  8. mysql 分区的作用_MySQL分区的优点
  9. 卸载安装Webpack
  10. PE-RTⅡ型供热管道产品的性能特点与应用优势