使用我自己的gensalt() - 它足够安全吗?

时间:2011-12-08 15:36:33

标签: python security bcrypt

由于bcrypt的机制是:

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

我想用它来验证身份。问题是我想从客户端创建它,所以我需要客户端中的 salt 部分。

我想,如果我使用自己的gensalt(username) - 从用户名生成一个盐 - 客户端总是使用相同的盐,这与其他用户不同。

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

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

1 个答案:

答案 0 :(得分:1)

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

首先,bcrypt不是加密函数,因此其功能的结果无法“解密”。 bcrypt是使用blowfish构建的消息摘要功能。消息摘要函数生成的哈希值被破解。

客户端使用消息摘要功能进行身份验证是非常有问题的。 Microsoft的NTLM使用消息摘要功能进行身份验证,它已经broken many times。我认为这种身份验证方法存在缺陷,应予以避免。

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

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