Flask_generate_password_hash的加盐哈希加密算法与check_password_hash的校验
密码加密简介
密码存储的主要形式:
- 明文存储:肉眼就可以识别,没有任何安全性。
- 加密存储:通过一定的变换形式,使得密码原文不易被识别。
密码加密的几类方式:
- 明文转码加密算法:BASE64, 7BIT等,这种方式只是个障眼法,不是真正的加密。
- 对称加密算法:DES, RSA等。
- 签名加密算法:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容易被暴力破解。如果密码相同,得到的哈希值是一样的。
- 加盐哈希加密算法:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运用这种加密方法。
签名加密算法的风险
签名加密算法的数据是无法被反解析成明文的,但因为加密算法的固定性(同样的字符串加密后哈希值是一样的),通过建立加密前后的映射关系,就能暴力破解加密后的哈希值。
import hashlib
password_map = {"e10adc3949ba59abbe56e057f20f883e": "123456"} # 哈希值与明文映射表
password = "123456" # 待加密明文
# 加密明文
_md5 = hashlib.md5()
_md5.update(password.encode("utf-8"))
p_md5 = _md5.hexdigest()
print(f"md5加密后的值为:{p_md5},通过md5映射表暴力破解出加密后的密码明文为:{password_map.get(p_md5)}")

加盐哈希加密算法
加盐哈希加密算法的原理是在加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。
import hashlib
import random
import string def generate_salt_hash(s: str):
# 随机生成长度为4的盐值
salt = "".join([random.choice(string.ascii_lowercase) for i in range(4)]) # 拼接原始密码和盐值
s = s + salt # 对加入盐值的字符串加密
_md5 = hashlib.md5()
_md5.update(s.encode("utf-8"))
return salt + "$" + _md5.hexdigest() # 返回 盐值+哈希值 的字符串 # 原始密码
password = "123456" p_md5_1 = generate_salt_hash(password)
p_md5_2 = generate_salt_hash(password)
print(p_md5_1)
print(p_md5_2)

Flask中的密码加密和验证
flask中主要用werkzeug.security 包中的generate_password_hash函数对密码进行加密,以及check_password_hash函数用于验证经过generate_password_hash哈希的密码
generate_password_hash函数语法:
generate_password_hash(password, method="pbkdf2:sha256", salt_length=8)
参数说明:
- password:明文密码
- method:加密的方式(需要是hashlib库支持的),格式为:pbkdf2:method:iterations,其中method为加密加密方式,比如md5,sha1,默认为sha256,iterations为迭代次数
- slat_length:盐值的长度,默认为8。
生成的hash值格式如下:
method$salt$hash
check_password_hash函数语法:
check_password_hash(pwhash, password)
参数说明:
- pwhash: generate_password_hash生成的哈希字符串
- password: 需要验证的明文密码
from werkzeug.security import generate_password_hash, check_password_hash # 明文密码
password = "123456" # 生成加密哈希值
p_hash = generate_password_hash(password)
print(p_hash) # 验证密码
ret = check_password_hash(p_hash, password)
print(ret) ret = check_password_hash(p_hash, "afdasfsda")
print(ret)

Flask_generate_password_hash的加盐哈希加密算法与check_password_hash的校验的更多相关文章
- (转)浅谈MD5加密算法中的加盐值(SALT)
我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就 ...
- Web应用你加盐了吗?——浅谈MD5加密算法中的加盐值(SALT)
转自:http://blog.csdn.net/blade2001/article/details/6341078 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散 ...
- [转]加盐hash保存密码的正确方式
0x00 背景 大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码, ...
- Android 网络交互之MD5为什么要加盐
MD5为什么要加盐 之前面试的时候,遇到一个面试的哥哥.不停的跟我确认我对网络传输过程中的password进行MD5加密的时候,是否加key了. 当时我很纳闷,因为MD5本身已经是不可逆的了,需要破解 ...
- MD5加密以及验证加密-加盐
加密与解密算法: /// <summary> /// 签名字符串 32位 /// </summary> /// <param name="input" ...
- 跟Microsoft.AspNet.Identity学习哈希加盐法
什么是哈希加盐法? 废话少说:对于MD5这种加密算法,同样的密码每次加密后得到的密文是一样的,所以黑客可以利用已知的密码库(彩虹库)对目标数据库密文进行对比进行攻击. 怎样解决:哈希加盐法,以下是网上 ...
- 使用nodeJS的 crypto模块来为你的密码hash加盐
这篇文章将向你解释如何使用Node.js的Crypto模块对你的密码进行加盐hash.在这里,我们将不会对不懂的密码存储方式进行详细的比较.我们将要做的是知道在Node.js中使用加盐hash在进行密 ...
- 模块 -- 序列化 hashlib sha logging (加密 加盐 )
模块: 一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...
- 消息摘要、哈希(hash)、加盐
hashlib 算法介绍: python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
随机推荐
- maven项目install时忽略执行test
1.在项目所在文件夹根目录使用maven命令打包时: <!-- 不执行单元测试,也不编译测试类 --> mvn install -Dmaven.test.skip=true 或 <! ...
- nvm命令
1.安装node nvm install node版本 2.查看已安装版本 nvm list 3.切换node版本 nvm use node版本 4.查看版本 node -v
- 关于finally中的语句和try中的return之间的执行顺序
首先是第一种情况: 我们这里由于程序只是单一的,所以后面的代码只有主题部分: Public class test{ Public static void main(String[] args){ Sy ...
- SimpleCursorAdapter 原理和实例
SimpleCursorAdapter 1. 原理参见下面代码注释 Cursor cursor = dbHelper.fetchAllCountries(); //cursor中存储需要加载到list ...
- [BUUCTF]PWN——pwnable_start
pwnable_start 附件 步骤: 例行检查,32位程序,什么保护都没开,首先想到的是ret2shellcode的方法 本地试运行一下,看看程序大概的情况 32位ida载入,没法f5,好在汇编不 ...
- M语言的写、改、删(Power Query 之 M 语言)
M语言基本上和其他语言一样,用敲键盘的方式写入.修改.删除,这个是废话. M语言可以在[编辑栏]或[高级编辑器]里直接写入.修改.删除,这个也是废话. M语言还有个地方可以写入.修改.删除,就是[自定 ...
- matplotlib模块详解
简单绘图,折线图,并保存为图片 import matplotlib.pyplot as plt x=[1,2,3,4,5] y=[10,5,15,10,20] plt.plot(x,y,'ro-',c ...
- LuoguP2097 资料分发1 题解
Content 有一些电脑,一部分电脑有双向数据线连接.如果一个电脑得到数据,它可以传送到的电脑都可以得到数据.现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据. 数据范围:\(n ...
- Java高级:条件队列与同步器Synchronizer的原理+AQS的应用
14.构建自定义的同步工具 类库中包含了许多存在状态依赖性的类,例如FutureTask,Semaphore和BlockingQueue等.在这些类中的一些操作中有着基于状态的前提条件,例如,不能从一 ...
- mdf与ldf文件如何还原到SQL Server数据库
1,首先新建两个数据库(Db1,Db2) 在Db1数据库中添加一个表: 然后点击数据库右键-属性-文件-找到文件路径 然后复制这个路径中的Db1的数据,把这两个文件放到其他文件之下 复制之前需要关闭S ...