使用 HTML5 localStorage 中的私钥在浏览器中运行 openpgp.js 的安全性

信息安全 加密 pgp html-5
2021-08-21 02:58:23

如果我要使用 openpgp.js ( http://openpgpjs.org/ ) 编写一个 Web 应用程序来创建 PGP 加密/签名消息,并且如果我将用户的私钥存储在 localStorage 中,这是否容易受到同样的关于 JavaScript 的抱怨Matasano 网页 ( http://www.matasano.com/articles/javascript-cryptography/ ) 上的密码学?

据我所知,Matasano 的要点概述是:

  • “将 Javascript 安全地传送到浏览器是一个先有鸡的问题。” (这可以通过使用 HTTPS 来解决)
  • JavaScript 不太适合密码学
  • 浏览器对于密码学来说太复杂了,因为它们有可能包含多个攻击向量。

如果 localStorage 不是存储敏感信息(如私钥)的最佳位置,那么还有什么更好的地方呢?

2个回答

HTTPS 仍然是绝对要求,而 Matasano 的主要观点是 JavaScript 永远无法取代 HTTPS。MITM 攻击可以提供自定义 JavaScript 有效负载,该有效负载可以读取本地存储中的任何机密,而 XSS 有效负载也可能会破坏这些数据。

Matasano 在 JavaScript 中的随机数生成器方面是错误的。大多数浏览器都提供了一个非常安全的随机数生成器 window.crypto.getRandomValues()我猜 Matasano 还没有阅读w3c Cryptography API for JavaScript此 API 包含一个使用操作系统熵池的随机数生成器。

如果您决定将秘密存储在 localStorage 中,则需要确保永远不会将明文会话密钥存储在那里。我不熟悉 openpgpjs,但它可能有助于安全存储密钥(我猜是某种形式的密钥环类)。