【问题标题】:Dcrypt a password without asking for master password在不询问主密码的情况下对密码进行加密
【发布时间】:2016-12-02 15:25:46
【问题描述】:

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

为了好玩,我正在开发一个密码管理器网站。并且想知道我的这个想法有多安全。

显然,用户存储的每个密码都是使用 AES-256 加密的,他们的主密码作为密钥和随机生成的盐。主密码也使用 Bcrypt 加密,但在此之前,它会使用 whirlpool 之类的东西进行大约 100,000 次散列,以增加尝试登录时的压力。

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

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

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

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

【问题讨论】:

  • 使用临时令牌而不是传递散列或密码。

标签: security session encryption passwords


【解决方案1】:

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

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

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

主密码也使用 Bcrypt 加密,但在此之前,它会使用漩涡之类的东西进行大约 100,000 次散列,以增加尝试登录时的压力

没有这个必要,只要增加 Bcrypt 的强度参数来增加他们尝试登录的时间。 Bcrypt 内置了密钥延伸功能。

【讨论】:

    【解决方案2】:

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

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

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

    顺便说一句,BCrypt 算法已经进行了密钥拉伸,因此没有必要添加额外的散列轮次。在这种情况下,更好的解决方案是增加成本因素​​。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2023-01-09
      • 2014-10-27
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多