【问题标题】:Best way to store private crypto key in browser?在浏览器中存储私钥的最佳方法?
【发布时间】:2015-04-06 12:23:21
【问题描述】:

我想在将一些用户数据发送到服务器之前对其进行加密。也就是说,数据将在浏览器的客户端使用 JavaScript 进行加密。

我的问题是,有哪些选项可用于在客户端存储私钥(它将在用户稍后查看数据时用于解密数据)?

HTML5 本地存储或仅从 JavaScript 读取包含密钥的本地文本文件似乎有点不对劲...... 是否可以为此目的使用个人证书?还是有其他选择?

编辑:

稍微澄清一下,

所有需要加密的敏感数据都是在客户端计算机上生成的,绝不应该以纯文本形式保留。有问题的数据主要是用户将上传到服务器的文件,但是我们将来可能还想加密一些表单字段。

一旦加密数据被发送到服务器,它就会以加密形式存储,并且永远不会在相同客户端计算机之外的任何其他地方解密。例如,如果用户决定下载他的文件,他将收到加密文件,这些文件将在浏览器中使用 JavaScript 解密。

对于我们来说,在同一台客户端计算机上生成公私密钥对也很重要。这只会由用户手动完成一次,或者在一些自动化解决方案的帮助下完成。

底线是,私钥和纯文本数据都不应该离开客户的机器。

【问题讨论】:

  • 您不需要私钥进行加密,只需公钥即可。
  • @AlexanderH 实际上,数据将使用公钥(存储在服务器上)加密,但是稍后需要解密,例如,当用户想要查看它时。因此需要将私钥客户端存储在浏览器中。
  • 那你需要第二对钥匙,我会说。其他一切就像不使用钥匙
  • 为什么你认为localStorage不是个好主意?
  • @AlexanderH 为什么是两对钥匙?密钥对将在客户端机器上生成,私钥永远不会离开它。只有公众被发送到服务器,主要是因为一些数据也需要在服务器端加密。相互身份验证将与所有这些分开处理。

标签: javascript web-applications cryptography rsa token


【解决方案1】:

根据您的描述,文件和表单字段中的数据只能在客户端上使用。在这种情况下,根本不需要使用公钥加密。您应该使用像 AES 这样的对称分组密码来加密这些数据并将它们发送到服务器。单个随机对称密钥将在客户端浏览器中生成并存储在localStorage 中,可能受密码保护(例如第二层 AES)。 AES 密钥是 128/192/256 位长的二进制字符串,它不应该离开客户端浏览器。

我认为localStorage 是唯一可行的选择,因为它已被所有现代浏览器实现。

可能还有其他解决方案,例如浏览器插件,甚至是 custom browser

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多