在Web应用程序中使用客户端加密时,应该在哪里存储密钥?

时间:2016-07-13 13:33:46

标签: javascript security encryption cryptography webcryptoapi

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

用户如何为这样的应用程序存储密钥,而不会使用起来不方便?

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

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

1 个答案:

答案 0 :(得分:1)

Web Cryptography Api的突破是为创建,使用和存储加密密钥提供本机支持,而不会泄露私钥的内容

总结:

  1. 使用WebCrypto生成密钥并将其标记为不可导出
  2. 将密钥存储到IndexedDB
  3. 您可以使用加密密钥,但其内容将为用户和程序员隐藏。请注意图像中的“cryptoKey”对象被浏览器隐藏

    Indexed DB with cryptographic key hidden

    为什么不使用......

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

    替代方案(@dandavis评论)

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

    当必须从服务器隐藏数据时,这些解决方案是合适的。让服务器处理您需要的客户端数据(取决于密钥的类型)

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

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