3

假设我想使用 JavaScript Web Crypto API向 Web 应用程序添加客户端加密。我的应用程序的客户端将使用他们的密钥加密每个用户的数据,然后将加密的数据发送到服务器,并解密服务器返回的数据以显示它。

用户如何为这样的应用程序存储他们的密钥,而不会使其使用不便?

是否有一些简单的方法可以将密钥存储在浏览器中?

还是每个用户都必须将其密钥保存在计算机上的本地文件中,并在每次登录时将其导入 Web 应用程序?他们可以使用像 Apple Keychain 这样的单独密码管理器吗?

4

1 回答 1

3

Web Cryptography Api 的突破是在不暴露私钥内容的情况下,为加密密钥的创建、使用和存储提供原生支持

总之:

  1. 使用 WebCrypto 生成密钥并将其标记为不可导出
  2. 将密钥存储到 IndexedDB

您可以使用加密密钥,但其内容对用户和程序员都是隐藏的。请注意图像中的“cryptoKey”对象被浏览器隐藏

隐藏加密密钥的索引数据库

为什么不使用...

  • Cookies / 本地存储:只允许文本存储。密钥应导出为 base64 的文本格式,其内容可能被恶意代理甚至用户复制...
  • 本地文件:它根本不是用户友好的。密钥的保护完全掌握在用户手中。每个应用程序都需要用户在 WebCrypto 中导入密钥。这个解决方案不受同源策略的保护。用户可以在其他站点使用密钥。

替代品(@dandavis 评论)

  • 不存储密钥从密码中派生密钥以与 AES 等对称加密算法一起使用。需要时派生密钥,提示用户输入密码。优点 使用密码管理器是可能的,但是,浏览器将存储密码字符串。密钥可以在多台计算机上使用

这些解决方案适用于必须对服务器隐藏数据的情况。让服务器处理您需要的客户端数据(取决于密钥的类型)

  • 对称密钥:您需要向服务器提供密钥本身(因此它必须是可提取的)或密码才能解密数据

  • 不对称密钥:服务器使用密钥对(公共/私有)。服务器将公钥发送给客户端。从客户端发送到服务器的数据使用服务器公钥加密并使用私钥解密。从服务器发送到客户端的数据使用客户端公钥加密,并使用客户端私钥解密。

于 2016-07-17T20:32:58.473 回答