2011-06-23 45 views
5

我正在寻找一种方式,以客户方解码RSA分别OpenSSL的编码消息。OpenSSL的解密在浏览器

理念:
特殊的数据只存储加密的服务器上的公共密钥,这样没有人能够看到真实的数据 - 即使是在服务器的黑客案件。
在adminforce的管理员则可以通过将其transfering到浏览器和“打开”这些文件的一些JavaScript代码,以便它永远不会解密的服务器上,只有在安全客户方的数据进行解码。
我真的需要它在自定义JavaScript浏览器中直接解码,因为这些数据已被js中的某些算法clientide使用。

问题:
似乎没有OpenSSL库中的JavaScript或我没有找到一个还没有。虽然有多种纯JS实现RSA的,他们只是实现了简单的RSA算法,但是,普通的RSA是不是安全使用的块加密,并具备“choosen明文攻击”一些攻击。
是否有人知道openssl解码的JavaScript实现,或者为Firefox添加这些功能到文档的插件?或者任何其他安全的非对称加密内置到JavaScript?

+1

这种方法存在一个小小的缺陷:如果你的服务器被黑客入侵,攻击者很可能会改变它所服务的JavaScript,这可能会将解密后的内容透明地发送回服务器(从而攻击者)。依赖JS意味着客户端在发生这类攻击时不再安全。你最好为此开发一个独立的应用程序,也许是一个签名的Java WebStart(或Applet),只要它没有用服务器上保存的私钥签名。 – Bruno

+0

布鲁诺你说得很对,但我不需要在服务器可能泄露的网页上运行openssl的js实现。我想写一个浏览器的扩展,不能被网页上的恶意js-code破坏。 –

回答

3

正如我在你的问题中留言指出,攻击向量你设想(破坏服务器)意味着JavaScript是有可能被泄露过,在这种情况下在客户端运行不该JavaScript代码无论如何都不会被信任。(使JavaScript在后台发送一个异步请求的解密数据回到服务器上会很容易:因为服务器将在攻击者的控制之下,所以不需要任何技巧来绕过它)

我会建议走下独立应用程序(如Java WebStart)的路线,也许签名(使用不在服务器上保存的私钥)。

如果您仍然愿意继续使用这种体系结构,请不惜任何代价将用户的私钥释放到JavaScript中。这可能会损害用户的私钥,而不仅仅是加密的数据。

当您在浏览器中使用私钥进行SSL/TLS客户端证书验证时,私钥不会暴露给服务器使用的任何代码。它被浏览器用于握手,并且服务器获取证书(这是公开的),但私钥不会接近HTML + JS代码可以看到的任何地方。 (事实上​​,在Safari中的OSX中,私钥被底层SSL/TLS库使用,甚至不会暴露给用户进程。)

我见过的RSA JavaScript库需要直接使用私钥,也就是说,他们需要能够直接使用私有指数。如果你处于不能信任服务器的情况,那显然不是很好。

能够在浏览器中使用私钥来进行RSA操作,而不让脚本获取私有资料本身,这需要与浏览器更紧密地集成,特别是一些API可以使用这些API来签名和解密直接在浏览器的安全机制中运行,而无需公开私钥材料(总体而言,PKCS#11为使用它的应用程序提供了类似的方法)。

据我所知,目前的Mozilla crypto JavaScript API没有提供使用浏览器解密/签名的功能(仅限于证书请求和密钥生成)。似乎有计划地做到这一点,虽然:

在IE者平台,CAPICOM应该引起大家的兴趣,但它似乎是时下deprecated

+0

即使网页遭到攻击者的破坏,Firefox也可以保存私钥。我已经搞砸了Mozilla Crypto API,但遗憾的是,它确实不支持这一点,我没有问它是否会受到支持:-( –

+0

的确如此。说实话,我还没有试过DOMCrypt(as在这里提到),但它也是开源的,所以它可能是值得研究的:https://github.com/daviddahl/domcrypt。你当然需要安装插件,但它似乎不是一个糟糕的解决方案 – Bruno

+0

不是我希望得到的答案,但我不会使用我的备份计划来构建一个独立的工具,而似乎没有一个自定义firefox插件在JavaScript中可以互操作的良好解决方案 –

1

Encrpytion是复杂和昂贵的 - 特别是不对称encrpytion(在大多数情况下,不对称加密仅用于加密随机生成的对称算法密钥)。

有RSA的实现(在javascript中可能还有其他不对称算法),在某些情况下,还有其他语言的兼容实现(通常是C) - 尝试谷歌的具体细节 - 但我不知道任何处理x509加密。 OTOH编写一个Java小程序来做到这一点将是微不足道的。

但何必呢?根据我对您写的内容的理解,您可以通过使用对称算法获得同样多的功能,而且不会将密钥发送回服务器:

  1. 允许用户输入一些在网页中
  2. 数据允许用户输入加密密钥
  3. 加密使用的密钥
  4. 加密后的数据发送回服务器
  5. 提供解密页面,用户可以检索加密数据内容并输入密钥
  6. 解密内容
+0

“...但我不知道任何处理x509加密”:没有关于X.509加密的具体内容。如果它是带RSA密钥的X.509证书,那么重要的是RSA算法,而不是X.509包装(更重要的是,因为只需要私钥来解密,这与公钥的方式无关“打包”:在X.509证书中,PGP证书或普通公钥)。 (在DSA中使用X.509证书中的DSA密钥时也是如此) – Bruno

+0

我知道非对称加密很昂贵,但我只需要编码几个字节。Symetric Encryption不是解决方案,因为服务器有(临时的)知道密钥的权利,所以这是一个不适用于此目的的解决方案。虽然“用户”不知道加密,但他将数据发送到服务器而不需要任何加密知识,并将其存储在那里加密以供管理员查看数据。 –

+0

@Tobias P .:“服务器知道密钥(临时)” - 您正在考虑通过使用大量复杂的算法来确保系统安全。服务器需要临时知道密钥的唯一原因是对加密内容的临时访问 - 您可以通过将未加密的副本与加密内容一起发回来执行此操作。 – symcbean

0

想想这个。如果存在服务器黑客攻击,黑客将可以访问您的加密数据和所有网站源代码。包括用于解密数据的那个。并且可以通过查看页面的来源以纯javascript的形式从网站界面获取这些内容。

+0

虽然,它不会得到最终用户的私钥。这仍然需要合法用户采取行动。 – Bruno

+0

@布鲁诺。找到一些http://www-cs-students.stanford.edu/~tjw/jsbn/ – TheBrain

+0

@TheBrain:你是什么意思?当然,您可以在JavaScript中实现RSA算法,但它如何帮助攻击者获得对私钥的访问?对于一个安全的系统,浏览器永远不应该将私钥发布给JS。 – Bruno