2016-07-28 89 views
0

所以我知道还有其他职位关于密码存储和加密,但我的问题是稍有不同。对我来说,裸露到底。加密一个密码,而不要求主密码

我正在密码管理器网站上工作,为了好玩。并想知道我的想法有多安全。

显然,用户存储的每个密码都使用AES-256加密,主密码作为密钥和随机生成的盐。此外,主密码使用Bcrypt进行加密,但在使用漩涡之类的方式之前,它会散列大约100,000次,以在尝试登录时增加应变。

如果用户决定每次他/她请求站点密码时都不想输入密码,程序将无法解密密码并自动填充,因为需要主密码才能解密存储的密码。

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

另一种方法是使用100,000次散列密码作为AES-256加密的密钥并将该散列存储在会话中。最好以纯文本形式存储它,但如果攻击者能够从会话中获取信息,它仍然可以解密存储的密码。

有没有更好的办法解决这个问题,或者这是一个失败的希望之战,当我登录时,攻击者没有进入?

+0

使用临时令牌而不是传递哈希或密码。 – dandavis

回答

0

如果你想完全安全,密码应该是存储在这样即使没有服务器才能解密,而无需用户输入的方式,因此,主密钥永远只能存放客户方。

由于您不希望它存储在会话中,您可以将它存储在cookie客户端,但底线是,如果入侵者已经违反了您的服务器并可以修改其代码,以便网站按照定义,如果密码的解密发生在服务器端,它们必须能够获得密码。

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

而且主密码使用Bcrypt加密的,但是手之前已哈希使用类似的旋涡,以提高应变尝试登录

没有必要当,只是一些10万次增加Bcrypt的强度参数以增加登录时的时间。 Bcrypt内置了密钥扩展功能。

0

不幸的是,你必须在安全性和便利性之间进行选择。

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

对于最大的安全性,甚至没有服务器必须能够解密存储的密码,如果关键仍然在客户端,这只是可能。你可以做的是为客户端编写一个应用程序,并使用服务器来存储加密的密码存储库。

顺便说一句,在BCrypt算法已经做关键拉伸,因此没有必要添加散列的额外回合。在这种情况下,更好的解决方案是增加成本因素​​。