如何将RSA私钥存储在客户端的浏览器中以获得更好的用户体验?

我计划编写一个基于Web的密码管理软件,以便在团队和成员中提供共享和权限功能。

编辑:

正如Luke Park在下面提到的那样,我想补充说我正在使用带令牌的用户密码授权(即过期)。 令牌在所有授权的API调用中提供,这些调用只能由注册用户访问。 是的,应用程序被SSL封装,使服务器和客户端之间的通信更加安全。

编辑结束

目前,我已经做了大量的研究,寻找处理密码加密的正确模式。 我所看到的模式称为混合加密,因为它可以与多个客户端协同工作并且可以安全地实施。 以下是我将如何在我的应用程序逻辑中实现此模式:

客户想创建一个密码

  • Andre创建一个密码并以纯文本形式提供密码
  • 前端应用程序生成一个称为会话密钥的对称密钥
  • 客户端用会话密钥加密普通密码
  • Andre选择将密码分享给Bob
  • 客户端通过REST从服务器应用程序中检索Bob的公钥
  • 客户端用Bob的公钥加密会话密钥
  • 客户端将加密的会话密钥和加密的密码传输到服务器
  • 服务器应用手柄密码提交

  • 服务器应用程序使用仅由服务器应用程序知道的私有盐来加密数据
  • Sever将数据存储到数据库中
  • 检索共享密码

  • Bob请求Andre最近共享的密码
  • 服务器使用私有盐解密所请求的数据集并将其发送给客户端
  • 客户端使用Bob的私钥(Bob的计算机提供)来解密会话密钥,
  • 使用解密的会话密钥,客户端可以现在解密密码(现在可以复制它)
  • 到目前为止,我看到这种模式足够安全,因为客户端的所有私钥都不公开,只对客户端可见。 为了在基于Web的应用程序中实现此功能,我找到了openpgpjs.org,它可以在客户端生成公钥和私钥,并使用这些密钥对数据进行加密或解密。 最重要的是,私钥字符串可以通过秘密密码来保护。

    我的问题是,如何在不妨碍用户体验的情况下将私钥文件实施到我的前端应用程序中? 我不想强制用户手动管理他的私钥并强制他为每个密码请求提供密钥。 将私钥文件存储到浏览器的本地存储并在每次密码请求时从本地存储获取私钥是否安全?


    您仍然无法验证您的客户端和服务器。 因为任何人都可以公开请求公共密钥,所以在客户端和服务器之间的MITM会很容易,并为其提供一个垃圾任意密码。

    考虑:

  • 攻击者使用REST检索Bob的公钥。
  • 攻击者生成他们自己的“会话密钥”并加密一些任意值。
  • 攻击者将结果反馈给客户,该客户一直处于中间状态。
  • 客户认为它已经收到了正确的密码,但没有收到。
  • 如果不能验证和授权服务器和客户端,你的系统就容易混淆了。 这似乎不是一个巨大的问题,但它可以轻松让位给其他攻击。

    编辑:也注意到,如果MITM发生在客户端和REST API之间,攻击者可以为客户端提供一个与攻击者拥有的私钥配对的公钥。

    考虑:

  • 客户端即将与服务器分享密码。
  • 客户联系REST API(MITM攻击者)来获取Bob的公钥。
  • 攻击者提供他们的公钥。
  • 客户端生成会话密钥和密码的密文。
  • 客户端将结果发送给“服务器”(攻击者)。
  • 攻击者使用他们的私钥来检索会话密钥。
  • 攻击者使用会话密钥来检索明文密码

  • 经过几次思考,我决定使用用户主密码加密RSA私钥。 由于主密码无处存储,因此我认为将加密的私钥存储到用户的本地浏览器存储中是安全的。 该解决方案可以自动为每个密码请求提供加密的私钥,但强制用户在每个请求中输入密码,这对我来说现在很合适。

    如果有人有更好的解决方案,我会很高兴,如果你可以在这里发布你的解决方案。

    链接地址: http://www.djcxy.com/p/21775.html

    上一篇: How to store RSA private keys in the client's browser for better UX?

    下一篇: Sharing only the public key Is secure?