将加密的私钥保存在 cookie 中

Posted

技术标签:

【中文标题】将加密的私钥保存在 cookie 中【英文标题】:Saving a crypted private key in a cookie 【发布时间】:2014-04-24 05:40:18 【问题描述】:

我目前正在从事一个安全性很高的项目,但在选择满足客户需求的技术解决方案时遇到了一些问题。

首先,让我解释一下客户的需求。

对于我客户的网站,有时用户需要生成 私钥公钥 客户端(gui : 浏览器)然后将公钥发送到服务器并在本地保存私钥(由用户选择的密码加密)。私钥需要保存,因为它在过程的第二部分使用一次(用户需要输入密码才能解密),一旦使用,我们可以处理私钥。

我必须补充一点,客户要求向后兼容 IE7。

第一个技术选择:Java Applet

我们查找的第一件事是使用 Java Applet,生成密钥就好了,但是我们在 Safari Mac OSX 上遇到了问题,appet 是沙盒的,用户需要执行一个复杂的操作来禁用沙盒 mod。我们的客户不想要这个,因为它不是用户友好的。

第二种解决方案:

我们保留了 java 小程序,但它不会在磁盘上保存任何内容,它仅用于执行加密操作。我们从 applet 将加密的私钥传递给 javascript 以保存在 cookie 中。我们做得很好,我们可以从 cookie 存储中检索加密的私钥并将其传递给小程序进行解密(弹出请求用户输入密码)。

问题 我们知道在技术上是可行的,但问题是:它是否安全,我们在浏览器的 cookie 存储中保存该私钥会承担什么样的风险?

如果你们中的一个人能帮助我,我会很有帮助!

干杯

【问题讨论】:

【参考方案1】:

主要问题是 cookie 仅适用于您发送到服务器的内容。它们不是用来存储的,您永远也不应该将您的私钥发送到任何地方。

Cookie 可以通过 XSS 窃取(始终假设您的站点中有 XSS 漏洞),然后攻击者可以尝试对其进行解密。

从宏观上看,你可以做得更糟。假设你的加密是可靠的,私钥可能是安全的,但最大的问题是你不应该使用这样的 cookie。在这里使用 Web Storage 可能是更好的解决方案。

【讨论】:

是的,Web Storage 是我的解决方案,问题是我需要 IE7 的解决方案。 IE7 不支持 localStorage,它的 polyfill 是基于 cookie 的存储 哦,当然。嗯...我想为此目的,cookie 可能是最好的方法,但仅适用于 IE7(检查浏览器版本等服务器端)。 (我知道你提到了这一点,但我会为其他阅读本文的人重申这一点:)确保它们是加密的并且仅限 https。我认为有 js 替代品,但你不太可能有一个用户会让你将任意文件写入他们的文件系统(尽管仍然在 IE7 上的那种人可能不会在意)【参考方案2】:

我会说将您的私钥保存在 cookie 中并不是一个很好的选择,因为出于安全原因,它们不应该保存敏感信息,而且我们的同事已经告诉了其他原因。 同样重要的是要注意,用户可以在任何给定时间清除他的所有 cookie 或完全禁用它。 该小程序将更好地满足您的客户要求,并可以让您例如提示用户使用私钥保存密钥库文件,这种文件旨在保存此类信息。

【讨论】:

Yes 提示用户保存私钥是最初的提议。但是我们有一个用户案例,用户(假设是管理员)可以为其组织中的人员申请证书。在这种情况下,管理员一个一个地保存每个私钥并记住哪个私钥属于谁是很麻烦的。这就是为什么我们要向用户隐藏这一步。但是所有的问题都来自于我们需要支持IE7,而IE7不支持localStorage...【参考方案3】:

Cookie 在每个请求中发送。这真的很糟糕,因为您希望私钥尽可能不通过网络发送。

假设您没有本地存储 (IE7),我知道在 cient 端存储信息的唯一方法是 cookie。我会说:尽可能使用本地存储,当你不能时,将私钥存储在服务器端。至少,您将发送一次。这很糟糕,但还不是真的很糟糕......

或者,也许您可​​以将 cookie 存储在您不再使用的专用子域中,但为了读取 cookie,即使在使用 javascript 的客户端,您也需要位于该子域的页面上,这意味着发送每次您想使用它时再次通过网络重新输入密钥。

据我所知。

【讨论】:

是的,我认为尽可能多地使用 localStorage 是解决方案。当然IE7除外。不幸的是,我无法控制服务器端发生的事情。我认为我必须为 IE7 保留基于 cookie 的存储,或者使用 Java Applet 来仅为 IE7 执行操作。【参考方案4】:

你可以使用 localstorage 然后为 IE7 部署 localstorage polyfill

【讨论】:

以上是关于将加密的私钥保存在 cookie 中的主要内容,如果未能解决你的问题,请参考以下文章

RSA公私钥和签名、验签过程

ssh-add和ssh-agent

用于加密的公钥;用于解密的私钥?

公钥密码里面,如果一方用自己的私钥加密,解密用自己的公钥,公钥不是公开的吗?任何人都可以解开

web服务器的私钥保存在啥地方?

在哪里保存用于生成和验证令牌的私钥?