在浏览器中使用javascript进行openssl解密

时间:2011-06-23 10:58:29

标签: javascript cryptography openssl rsa public-key-encryption

我正在寻找一种方法来客户端解码RSA和openssl编码的消息。


特殊数据仅在服务器上使用公钥加密存储,这样任何人都无法看到真实数据 - 即使是服务器黑客也是如此。
然后,adminforce中的管理员可以通过将这些文件传输到浏览器来“打开”这些文件,并且一些javascript代码将对数据进行解码,以便它永远不会在服务器上解密,只能在安全的客户端上解密。 我真的需要在浏览器中使用自定义javascript解码direclty,因为这些数据随后将由js中的某些算法客户端使用。

问题:
javascript中似乎没有openssl库,或者我还没找到。虽然RSA有几个纯js实现,但它们只实现了普通的RSA算法,但普通的RSA不能用作块密码,并且有一些攻击,如“选择明文攻击”。 /> 有没有人知道openssl解码的javascript实现,或firefox / chrome的插件,它将这些功能添加到文档中?或者javascript中内置的任何其他安全的非对称加密?

4 个答案:

答案 0 :(得分:3)

正如我在对您的问题的评论中指出的那样,您正在设想的攻击向量(受损服务器)意味着JavaScript可能也会受到损害,在这种情况下,客户端上运行的JavaScript代码不应该无论如何都要信任。 (在后台使用异步请求使JavaScript将解密数据发送回服务器是非常容易的:再次,由于服务器受到攻击者的控制,因此不需要任何技巧来绕过它-origin政策那里。)

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

如果您仍然愿意继续使用此类架构,请避免不惜一切代价将用户的私钥释放到JavaScript中。这可能会损害用户的私钥,而不仅仅是加密数据。

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

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

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

据我所知,当前Mozilla crypto JavaScript API不提供使用浏览器解密/签名的功能(仅用于证书请求和密钥生成)。似乎有计划这样做:

在IE平台上,CAPICOM应该是有意义的,但现在似乎是deprecated

答案 1 :(得分:1)

加密非常复杂且昂贵 - 尤其是不对称加密(在大多数情况下,不对称加密仅用于加密随机生成的对称算法密钥)。

有RSA的实现(可能还有javascript中的其他非对称算法),在某些情况下,还有其他语言的兼容实现(通常是C) - 尝试使用谷歌来获取具体信息 - 但我不知道有哪些处理x509加密。 OTOH写一个java小程序来做这件事是微不足道的。

但为什么要这么麻烦?根据我对你所写内容的理解,通过使用对称算法并且永远不会将密钥发送回服务器,你可以获得尽可能多的功能:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您不必依赖网络服务器向您发送加密数据和关联的JavaScript代码来解密数据(如果服务器受损,则可能会损坏),您只能从网络服务器下载数据并解密它可以与独立的应用程序一起使用,也可以与包含JavaScript的网页(不是来自同一台网络服务器)(可能来自另一台服务器或本地文件)一起使用。这样,将不会有任何响应返回到原始服务器或攻击者。

可以使用只有您知道并且可以解密的密钥(AES或RSA)对服务器上保留的数据进行加密,并且服务器只能用于存储。对于解密,请先将数据下载到受信任的本地计算机,这样一来,您只有在非常有限的时间内才能访问未加密的数据。

查看此native implementation of TLS in JavaScript.
这是enable Windows Subsystem for Linux in Win 10 的安装指南 Bash,它带有SSL。 Check your version & get the latest.