若将密码以明文的方式保存在数据库中是不安全的,可以使用一些如MD5的方式加密,但像这种加密方式也是存在安全隐患的,这里我们来学习一下利用Flask中的werkzeug.security模块加密
。
1、这种加密方式的原理:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使
密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运
用这种加密方法。
2、这个模块主要是用到了两个函数:
- 密码生成函数:generate_password_hash;
- 密码验证函数:check_password_hash;
3、密码生成函数:generate_password_hash
(1)函数定义
werkzeug.security.generate_password_hash(password, method='pbkdf2:sha1', salt_length=8)
参数说明:
- password: 明文密码;
- method:哈希加密的方法(需要hashlib库支持的),格式为pdpdf2:[:iterations];
method:哈希的方式,一般为SHA1;
iterations:(可选参数)迭代次数,默认为1000;
-slat_length: 盐值的长度,默认为8。
(2)密码生成示例:
from werkzeug.security import generate_password_hash,check_password_hash
print (generate_password_hash('123456'))
print (generate_password_hash('123456'))
输出:
pbkdf2:sha1:1000$0yy56h3w$ae1030bd575e95a1b7066120d6b2381ae01f678d
pbkdf2:sha1:1000$Roji1qH7$c6867df485c8c9ff094025e1bf779cbf570dcbf1
因为盐值是随机的,所以就算是相同的密码,生成的哈希值也不会是一样的。
4、码验证函数:check_password_hash
(1)函数定义
werkzeug.security.check_password_hash(pwhash, password)
参数说明:
- pwhash:generate_password_hash生成的哈希字符串(即加密后的密码);
- password:需要验证的明文密码;
check_password_hash函数用于验证经过generate_password_hash哈希的密码,若密码匹配,则返回真,否则返回假。
(2)密码验证示例:
from werkzeug.security import generate_password_hash,check_password_hash
pwhash = "pbkdf2:sha1:1000$Roji1qH7$c6867df485c8c9ff094025e1bf779cbf570dcbf1"
print (check_password_hash(pwhash,'123456'))
输出:True