首页 > 解决方案 > 如何使用哈希进行密码检查?

问题描述

我正在通过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如果同一个字符串可以有尽可能多的哈希值,那么它是如何工作的呢?

标签: pythonhash

解决方案


密码用盐进行哈希处理,盐是字母和数字的伪随机字符串。每次跑步时盐都会不同generate_password_hash()。因此,生成的哈希值也会有所不同。

这样做是为了让黑客无法简单地猜测常用密码的哈希值。例如,'pass1234' 的哈希值每次都是相同的。但是,'pass1234 + salt 的哈希每次都会不同。您的数据库应该存储哈希值以及盐值(重要的是不是明文密码)。如果有关用户帐户的信息泄露,这可以最大限度地减少造成的损害。

在 Flask 和 werkzeug 的情况下, 的返回值采用generate_password_hash()以下形式:(method$salt$hash您可以在您提供的屏幕截图中看到这两个$符号)。因此,下次您根据哈希检查明文密码时,您将使用盐值从它获取它,generate_password_hash()并查看它是否与哈希值匹配。


推荐阅读