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



由于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上进行暴力破解。

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

首先,bcrypt不是一个加密函数,因此这个函数的结果不能被"解密"。Bcrypt是一个使用河豚构建的消息摘要函数。消息摘要函数产生的哈希值被破解。

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

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

生成一个随机的盐,bcrypt.gensalt(12)可能是好的。将散列和盐存储在数据库中。您必须使用安全传输层进行身份验证。请务必阅读owasp a9