【发布时间】:2016-01-16 21:46:36
【问题描述】:
我正计划编写一个基于 Web 的密码管理软件,以便在团队组和成员中提供共享和权限功能。
编辑:
正如下面 Luke Park 所提到的,我想补充一点,我正在使用带有令牌(过期)的用户密码授权。令牌在所有授权的 API 调用中提供,使得这些调用只能由注册用户访问。是的,应用程序由 SSL 封装,使服务器和客户端之间的通信更加安全。
编辑结束
目前我已经做了很多关于寻找正确的密码加密处理模式的研究。我正在研究的模式称为混合加密,因为它适用于多个客户端并且可以安全地实施。以下是我将如何在我的应用程序逻辑中实现此模式:
客户想要创建密码
- Andre 创建密码并以纯文本形式提供密码
- 前端应用程序生成一个对称密钥,称为会话密钥
- 客户端使用会话密钥加密明文密码
- Andre 选择将密码分享给 Bob
- 客户端通过 REST 从服务器应用程序中检索 Bob 的公钥
- 客户端使用 Bob 的公钥加密会话密钥
- 客户端将加密的会话密钥和加密的密码传输到服务器
服务器应用程序处理密码提交
- 服务器应用程序使用只有服务器应用程序知道的私有盐对数据进行加密
- 服务器将数据存储到数据库中
检索共享密码
- Bob 请求 Andre 最近共享的密码
- 服务器使用私有盐解密请求的数据集并将其发送给客户端
- 客户端使用 Bob 的私钥(由 Bob 的计算机提供)解密会话密钥
- 使用解密的会话密钥,客户端现在可以解密密码(例如现在可以复制)
到目前为止,我认为这种模式足够安全,因为客户端的所有私钥都不是公开的,并且只对客户端可见。为了在基于 Web 的应用程序中实现这一点,我发现 openpgpjs.org 可以在客户端生成公钥和私钥,并使用这些密钥加密或解密数据。最重要的是,私钥字符串可以通过秘密密码保护。
我的问题是,如何在不影响用户体验的情况下将私钥文件实现到我的前端应用程序中?我不想强迫用户手动管理他的私钥并强迫他在每个密码请求上提供密钥。将私钥文件存储到浏览器的本地存储中并在每次密码请求时从本地存储中获取私钥是否安全?
【问题讨论】:
-
这一切都很好。但对我来说,将密码存储在网络环境中的想法听起来很荒谬。
-
只要加密足够安全,它是一个Web应用程序这一事实并不会显着影响整体安全性。另外,我不打算提供 SASS 实现,而是提供安全的自托管应用程序,例如可以在本地进行管理。
-
Web 环境的问题是,作为用户,我无法检查我正在使用的内容。与本地安装的实用程序不同,我无法检查代码,因为每次访问该实用程序时都会重新加载它。根据定义,这是我无法信任的情况。 “网络”是个好东西。但它不是可以很好地替代所有东西。
-
我同意你对信任因素的看法,但是这个应用程序有一个非常特定的目的,并且不会针对那些不信任它的人。
-
没有人可以信任它。 :-) 除了(也许)服务提供商。
标签: javascript security web cryptography password-protection