无需密码即可密码密码

时间:2016-07-28 09:53:35

标签: security session encryption passwords

我知道还有其他关于密码存储和加密的帖子,但我的问题略有不同。

我正在使用密码管理器网站,以获得乐趣。并且想知道我的想法有多安全。

显然,用户存储的每个密码都使用AES-256加密,主密码为密钥,随机生成盐。主密码也是使用Bcrypt加密的,但是在使用像漩涡之类的东西之前它会进行大约100,000次哈希处理,以增加尝试登录时的压力。

如果用户在每次请求网站密码时都决定不输入密码,则程序无法解密密码并自动填写,因为需要使用主密码来解密存储的密码。

我有一个想法是将密码存储在用户当前会话中,但这并不是一个好主意,因为我试图假设攻击者已经破坏了我的服务器并正在下载数据库并窥探。 / p>

另一种方法是使用100,000次哈希密码作为AES-256加密的密钥,并在会话中存储该哈希值。这比以纯文本格式存储更好,但如果他/她可以从会话中获取信息,它仍然可以让攻击者能够解密存储的密码。

是否有更好的方法可以解决这个问题,或者当我登录时攻击者没有进入这种希望之战?

2 个答案:

答案 0 :(得分:0)

不幸的是,您必须在安全性和便利性之间做出选择。

人们可以更难以获得钥匙,例如使用基于硬件的解决方案,但最终在某些时候,您的应用程序必须能够以纯文本格式检索存储的密码。如果攻击者完全控制了服务器,那么没有什么能阻止他完全执行相同的步骤。

为了最大限度地提高安全性,即使服务器也必须能够解密存储的密码,并且只有在密钥保留在客户端时才可以。您可以做的是为客户端编写应用程序,并仅使用服务器来存储加密的密码存储库。

BTW,BCrypt算法已经进行了键拉伸,因此没有必要添加额外的散列。在这种情况下,更好的解决方案是增加成本因素​​。

答案 1 :(得分:0)

如果您想要完全的安全性,密码应该以这样的方式存储,即使服务器在没有用户输入的情况下也不能解密它们,因此主密钥只能存储在客户端。

由于您不希望它存储在会话中,您可以将其存储在Cookie客户端,但如果入侵者违反了您的服务器并且可以修改其代码,那么最重要的是,为了如果密码解密发生在服务器端,那么根据定义,它们必须能够获取密码。

因此,如果您愿意,您可以编写一个javascript /客户端应用程序,它将接收给定用户的AES加密字符串,并在客户端输入主密码时对其进行解密。问题在于,在向用户提供加密密码之前,您必须拥有次要信息,否则您必须愿意为每个人提供加密密码。这里还有一个隐藏的复杂性,如果你的入侵者能够改变服务器上的代码,他们理论上可以将它从运行客户端改为运行服务器端,从而获得那些解密密码,或者他们可以修改客户端javascript使用解密的密码进行AJAX调用。

  

主密码也是使用Bcrypt加密的,但是在使用像漩涡之类的东西之前它会被移动大约100,000次,以增加尝试登录时的压力

没有必要,只需增加Bcrypt的强度参数来增加他们尝试登录的时间。 Bcrypt内置了键拉伸。