- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码片段:
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
pwd_context.hash(password)
描述here .
我不明白的是,如果它一直返回相同的散列密码而不考虑另一个 secret_key 例如散列密码值,这怎么能安全?
最佳答案
您假设它始终返回相同的散列密码而不考虑另一个“ secret ”(好吧,这不是真正的 secret )是错误的;如果你运行 pwd_context.hash
你会看到这个多次:
>>> from passlib.context import CryptContext
>>>
>>> pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
>>> pwd_context.hash("test")
'$2b$12$0qdOrAMoK7dgySjmNbyRpOggbk.IM2vffMh8rFoITorRKabyFiElC'
>>> pwd_context.hash("test")
'$2b$12$gqaNzwTmjAQbGW/08zs4guq1xWD/g7JkWtKqE2BWo6nU1TyP37Feq'
正如您所见,这两个哈希值并不相同——即使给定相同的密码也是如此。那么到底发生了什么?
当你不给 hash
一个明确的盐(你所说的 secret “ key ”)one will be generated for you by passlib
.值得指出的是,散列与加密不同,因此没有key 可谈。相反,您会看到 salt
提到,这是一个明文值,用于确保相同的密码经过两次哈希处理会产生不同的结果(因为您实际上是在对 salt + password
进行哈希处理)。
那么为什么我们会得到两个不同的值呢? salt
是实际 bcrypt 值的前 22 个字符。字段由 $
分隔- 2b
表示 bcrypt,12
表示 12 轮,下一个字符串是为密码存储的实际结果值(salt+resulting bcrypt hash)。该字符串的前 22 个字符是哈希。
如果你给 bcrypt 一个盐而不是让它生成一个盐,你可以看到这一点(我们将在这里忽略关于小填充的可能警告,但为了展示这个概念):
>>> pwd_context.hash("test", salt="a"*22)
'$2b$12$aaaaaaaaaaaaaaaaaaaaaOm/4kNFO.mb908CDiMw1TgDxyZeDSwum'
^-------------------^
如果我们显式给出相同的哈希值,结果应该是相同的(以及以后如何验证密码):
>>> pwd_context.hash("test", salt="a"*22)
'$2b$12$aaaaaaaaaaaaaaaaaaaaaOm/4kNFO.mb908CDiMw1TgDxyZeDSwum'
>>> pwd_context.hash("test", salt="a"*22)
'$2b$12$aaaaaaaaaaaaaaaaaaaaaOm/4kNFO.mb908CDiMw1TgDxyZeDSwum'
前面的哈希也是如此:
>>> pwd_context.hash("test")
'$2b$12$gqaNzwTmjAQbGW/08zs4guq1xWD/g7JkWtKqE2BWo6nU1TyP37Feq'
^-------------------^
这是实际生成的盐,然后与 test
一起使用创建实际的哈希:
>>> pwd_context.hash("test")
'$2b$12$gqaNzwTmjAQbGW/08zs4guq1xWD/g7JkWtKqE2BWo6nU1TyP37Feq'
^------------------------------^
那么,既然大家都可以清楚地看到这种盐,为什么我们还要使用它呢?不可能只扫描已知哈希的哈希列表 - 因为 test
列表中的值将不同于 test
在您要与之比较的列表中(因为不同的盐),您必须实际上测试猜测的密码及其盐,并通过散列算法运行它们。 bcrypt
被明确设计为使该过程需要时间,因此您将花费更长的时间来尝试破解密码,而不仅仅是扫描 2 亿个密码的列表并在数据库中搜索已知的哈希值。
那么当计算机变得更快时,你会怎么做?你增加12
参数 - rounds
- 这增加了散列算法的运行时间,希望更安全地保持更长时间(您可以尝试 rounds
的 passlib.hash
参数)。
关于fastapi - CryptContext 散列如何知道使用什么 secret ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71256713/
我有以下代码片段: from passlib.context import CryptContext pwd_context = CryptContext(schemes=["bcrypt"], de
我是一名优秀的程序员,十分优秀!