服务器端 public 密钥加密与浏览器端解密

Server-side public key encryption with browser-side decryption

我的应用程序要求在静态存储时对某些字段进行加密,并允许用户通过输入密码在浏览器中本地解密它们。然而,这些加密字段并不是由经过身份验证的用户自己输入数据库的,而是其他向用户提供私人信息的人提交的。

如果我将密码存储在数据库中以加密新提交的内容,那么任何有权访问该数据库的人都可以轻松解密加密的信息。所以,我相信我需要在数据库中存储一个 public 密钥,使用 public 密钥加密传入信息,然后将该加密信息提供给用户并让他用他的密码解密它浏览器。 (因此,服务器端,我们永远无法解密任何东西。)

我研究过像 ursa 这样的库,但问题是用户必须保存他的私钥。 (正确?)有什么方法可以使用相对较短的密码而不是长私钥来做到这一点?

你可以在密码加密模式下使用类似JSBN to generate a public-private key pair on the client and use CryptoJS的东西来用AES加密私钥。然后将加密的私钥和明文 public 密钥发布到服务器并添加到数据库中。

下次用户获得使用his/her public 密钥加密的信息时,您将加密信息和加密私钥发送到client/browser。用户可以再次输入密码来解密私钥,然后在第二阶段解密有效负载。

请注意,这并非绝对安全,因为未加密的流量(例如无 TLS)将使攻击者能够扩展 html/js 以包含数据窃取脚本。此外,无论是否使用 TLS,您的系统开发人员也可以随时添加这样的脚本。