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

标签 javascript security encryption cryptography webcrypto-api

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

用户将如何为这样的应用程序存储他们的 key ,同时又不会给使用带来不便?

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

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

最佳答案

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

总结:

  1. 使用 WebCrypto 生成 key 并将其标记为不可导出
  2. 将 key 存入IndexedDB

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

Indexed DB with cryptographic key hidden

为什么不使用...

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

备选方案(@dandavis 的评论)

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

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

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

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

关于javascript - 在 Web 应用程序中使用客户端加密时, key 应该存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38353273/

相关文章:

node.js - Node JS decipher.final() 抛出 "wrong final block length"错误

wpf - 连接字符串 RsaProtectedConfigurationProvider 策略

python - 用python加密/解密文件

javascript - 从javascript代码顺序加载javascript

javascript - 如何在不实例化 Ace 编辑器实例的情况下使用 Ace 编辑器验证器?

javascript - 检测破折号中的页面变化

javascript - 为什么在脚本标签有效时禁止跨域ajax?

javascript - 如何将分钟转换为 HH :mm with moment plugin

ruby-on-rails - 使用第三方服务本地主机子域是否存在安全风险?

c# - 存储经过良好散列处理的密码及其散列方法是否很危险?