由于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 是使用 blowfish 构建的消息摘要函数。消息摘要函数生成的哈希已被破解。
客户端使用消息摘要功能进行身份验证是非常有问题的。 Microsoft 的 NTLM 使用消息摘要功能进行身份验证,已被 broken many times .我认为这种身份验证方法存在缺陷,应该避免。
使用消息摘要功能的原因是作为分层安全的深度防御措施。如果攻击者能够找到一个 sql 注入(inject)漏洞,你想迫使他们在登录之前花费资源来破解哈希。如果我可以从数据库中提取哈希,并使用它来登录,那么你的系统就一文不值了。当客户端使用哈希进行身份验证时,重放攻击 是一个巨大的问题。如果我可以嗅探网络并重播登录序列,那么这个系统就毫无值(value)了。
生成随机盐,bcrypt.gensalt(12) 可能没问题。将散列和盐存储在您的数据库中。您必须使用安全传输层进行身份验证。请务必阅读 owasp a9 .
