2

由于bcrypt的机制是:

>>> myhash = bcrypt.hashpw('testpassword', bcrypt.gensalt(12))
>>> myhash    
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi'
>>> bcrypt.hashpw('testpassword', myhash)
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi'

我想将它用于身份验证。问题是我想从客户端制作它,所以我需要客户端中的部分。

我想,如果我使用我自己的gensalt(username)——它从用户名生成一个盐——对客户端来说总是使用与其他用户不同的相同盐可能是件好事。

这是 bcrypt 和我的项目的一个很好的近似值,还是我打破了 bcrypt 机制的安全性?

我在想,如果有人想解密密码,就不可能使用彩虹表,因为他必须为每个用户使用一个。我在安全问题方面没有足够的经验,不知道这是否会好。也许它hashpw的速度足以在 PC 上进行蛮力。

4

1 回答 1

1

简短的回答是: ,您所描述的根本不安全。

首先,bcrypt 不是一个加密函数,因此这个函数的结果不能被“解密”。bcrypt 是使用河豚构建的消息摘要功能。消息摘要函数产生的散列被破解。

客户端使用消息摘要功能进行身份验证是非常有问题的。Microsoft 的 NTLM 使用消息摘要功能进行身份验证,已多次被破坏。我认为这种身份验证方法是有缺陷的,应该避免。

使用消息摘要函数的原因是作为分层安全性的纵深防御措施。如果攻击者能够找到 sql 注入漏洞,您希望强制他们花费资源来破坏哈希,然后才能登录。如果我可以将散列从数据库中提取出来,并用它来登录,那么你的系统就完全没有价值了。 当客户端使用哈希进行身份验证时,重放攻击是一个巨大的问题。如果我可以嗅探网络并重播登录序列,那么这个系统完全没有价值。

生成随机盐,bcrypt.gensalt(12)可能没问题。将哈希和盐存储在数据库中。您必须使用安全传输层进行身份验证。确保您阅读owasp a9

于 2011-12-08T15:56:46.643 回答