python - 如何使用哈希进行密码检查?
问题描述
我正在通过Miguel Grinberg的精彩教程学习 Flask。在那一章中,出于安全原因,他建议存储用户的密码哈希而不是密码本身。使用的函数是generate_password_hash
, check_password_hash
。但即使你generate_password_hash
用相同的字符串调用,你也可以获得不同的哈希值:
>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash('foo')
'pbkdf2:sha256:50000$E4Mg0BEy$c8db80b3ddefad78a93eaa47b22da5ce04adb969913b00545302cbf23501fdbb'
>>> generate_password_hash('foo')
'pbkdf2:sha256:50000$UCXVV09c$fe38b6099a0059957e283f2e4706fdbf01ef6e762b1070116df17867aa04e053'
那么check_password_hash
如果同一个字符串可以有尽可能多的哈希值,那么它是如何工作的呢?
解决方案
密码用盐进行哈希处理,盐是字母和数字的伪随机字符串。每次跑步时盐都会不同generate_password_hash()
。因此,生成的哈希值也会有所不同。
这样做是为了让黑客无法简单地猜测常用密码的哈希值。例如,'pass1234' 的哈希值每次都是相同的。但是,'pass1234 + salt 的哈希每次都会不同。您的数据库应该存储哈希值以及盐值(重要的是不是明文密码)。如果有关用户帐户的信息泄露,这可以最大限度地减少造成的损害。
在 Flask 和 werkzeug 的情况下, 的返回值采用generate_password_hash()
以下形式:(method$salt$hash
您可以在您提供的屏幕截图中看到这两个$
符号)。因此,下次您根据哈希检查明文密码时,您将使用盐值从它获取它,generate_password_hash()
并查看它是否与哈希值匹配。
推荐阅读
- javascript - 如何过滤掉javascript选项中的对象
- unity3d - 统一添加facebook sdk后无法合并android清单
- c# - ASP .NET Web API 中不区分大小写的枚举
- python - 多选列与 pandas 数据框的智能合并
- sql - 如何更改其中包含变量的 SQL 脚本以作为 SSIS 包运行
- ios - AFNetworking:- errorcode=-999 "cancelled" with https only
- java - 在Java中,如何实现类似使用模板参数的功能以避免在C++中创建Creator子类?
- c# - 如何在 xamarin.forms 中获取媒体播放器文件播放完成事件?
- python - 如果使用 Optimizer 捕获梯度,它会计算两倍的梯度吗?
- angular - 如何使用角度动画在点击时为图像设置动画