5

我有兴趣在 LAMPhp 服务器上使用公钥加密的东西,使用 Web 客户端上的适当私钥解密(至少是 firefox,最好是标准 javascript)

请注意,我想要做的不仅仅是使用 SSL/https 进行加密连接。甚至使用基于浏览器的客户端证书作为登录/访问控制方法。我知道如何做这两件事。我想做的更像是使用 gpg 密钥发送电子邮件。我希望能够创建一条短消息,我将使用用户公钥加密该消息 - 只有他们 - 才能使用他们的私钥解密。我正在寻找的不是 ssl 自动实现的隐私,而是只允许特定用户解密消息的能力。我知道我可以使用 gpg 或 SMIME 轻松做到这一点,这也许是最好的方法,但我更喜欢基于 Web 的替代方案。

Firefox 等有一个证书存储,我知道出于明显的安全原因,持有的私钥不太可能导出到 javascript 中,但我认为有一些方法可以 - 使用 - 来自 javascript 调用的证书来解密某些东西..

我想这样做的原因是,我需要一种安全的方法来将随机生成的密码提供给特定的管理员。我正在尝试实现完整的数据库半透明性,而公钥加密似乎是这项工作的重要组成部分。但这是一个用例,如果没有这种能力,我将无法解决。

所以在php方面我会像这样使用openssl加密调用......

<?php

$browsers_public_key = get_it_from_the_browser_via_apache_maybe(); 

openssl_public_encrypt($data,$encrypted_ends_up_here,$browsers_public_key);

echo "<html><head>
<script type='javascript'>
      function decrypt_textarea(){  
            ??
     }
</script>
</head>
<body><textarea id='decrypt_me'> $encrypted_ends_up_here </textarea> 
<div id='where_the_plaintext_goes'>  </div>
</body> </html>";

?>

请注意,我通过stackoverflow 发现了许多优秀的javascript 加密库......但我实际上想使用根据MyOpenId.com 或CaCert.org 导入Firefox 的密钥

有谁知道这是否可能?

谢谢,-FT

4

4 回答 4

3

你问这个问题已经有一段时间了,但如果你或其他人正在寻找这个问题或类似问题的潜在解决方案,他们应该查看 JavaScript Forge 项目:

http://github.com/digitalbazaar/forge/blob/master/README

该项目在 JavaScript 中实现了 SSL,允许您在与 Apache 通信时包含客户端证书。您还可以使用关联的私钥(您可以在 JavaScript 中访问)手动执行 RSA 解密。

例如,JavaScript 可以获取/发布到服务器并包含其客户端证书。Apache 可以读取此证书,使用公钥加密任何适当的数据,然后将该数据返回给客户端。然后,客户端可以使用其私钥(在 JavaScript 中)并解密信息并对其进行处理。但是,如果您的服务器可以将客户端证书验证为您尝试传递的密钥的适当接收者,则这种额外的加密可能甚至不是必需的。

Forge 项目还具有 API 来构建系统,用于将密钥和证书导入/导出到 Firefox 或其他浏览器(如果出于某种原因仍然需要)。可能需要从 openssl 获得一点帮助才能以正确的格式获取密钥/证书以进行导入/导出 (pem => pkcs12),但是可以在基于 JavaScript 的 WebID 演示中找到其中一些工作原理的示例。WebID 是一个基于证书的客户端认证系统:

WebID 管理演示:https ://webid.digitalbazaar.com/manage/

WebID 认证演示:https ://payswarm.com/webid-demo/

请注意,上述站点的 SSL 证书是自签名的,需要将临时例外添加到您的浏览器才能查看它们。这些网站不要求您输入任何个人信息,它们仅用于演示目的。但是,如果您转到第一个链接,您可以在浏览器中生成密钥(它使用 Forge JavaScript 来执行此操作),然后您可以在顶部的列表中以 PEM 格式查看生成的私钥和证书的页面。密钥和证书通过 Flash 本地存储进行持久化。

几乎 100%(如果不是)的 WebID 管理站点的源代码都是可见的,因为它主要是 JavaScript。此外,Forge 项目本身(参见 github 链接)是开源的。

于 2010-08-31T15:48:05.950 回答
2

现在我明白了你在说什么,我可以给你一个肯定的答案:)

我能告诉你的最好的就是你无法以你想要的方式获得像样的加密。私钥加密(即 RSA)使用非常、非常、非常大的数字进行加密。使用小数很容易在计算上破解(只有这么多的素数),而且数字变大的速度非常快。基本上,使用 RSA,您需要获取大量数字并将它们提高到大指数。JavaScript 能够支持相当大的数字,但你会在性能上碰壁。使用 512 位密钥,几千字节的加密可能需要几秒钟,而解密可能需要几秒钟到几分钟。JS 这么慢的原因仅仅是因为它不是一种编译语言。当然,您可以减小密钥大小,但是任何大于几千字节的内容都会出现问题。

此外,RSA 在网页中本质上是不安全的,因为私钥与要解密的数据一起传输(除非它是更早传输的),这使得接收页面的任何人都可以解密数据。

我将假设您希望这样做是因为您想混淆来自您的用户或客户端的一些代码,所以我将建议您检查 XOR 加密。诚然,它远不如 RSA 安全,但它使用的原则如果使用得当,就会非常安全。例如,如果您使用仅使用一次且与您的数据/代码长度相同的随机密钥(一次性密码),则您的加密是“不可破解的”。更好的是,XOR 加密速度很快。以下是一些资源:

http://guymal.com/mycode/xor_js_encryption/

http://javascript.internet.com/passwords/xor-encryption4.html

希望你对你正在尝试做的事情有好运!

于 2010-01-19T18:14:19.227 回答
1

我正在搜索您所做的完全相同的事情,并且也想使用 php 的 openssl 函数。我很高兴看到在 phpside 上一切都与私钥/公钥(加密/解密)一起工作得很好,现在想找到一种在客户端使用私钥的方法,就像你做的那样。

!!!

如果您能找到任何东西,请通过电子邮件告诉我:

pki (at) life.de

!!!

对于性能方面:您将使用对称加密对大部分内容进行加密,并且仅使用客户端的公钥对解密密钥进行加密。所以你不需要加密很多kb。

但这似乎是使用 firefox 的死胡同,但使用 IE 和 ActiveX 似乎可以使用 CAPICOM(我现在没有太多了解它)。hxxp://geekswithblogs.net/shahed/archive/2007/05/03/112232.aspx

但是对于 JavaScript/PHP,请查看(并阅读常见问题解答和其他页面上的所有评论!将来可能会提到双向通信):hxxp://www.jcryption.org/

hxxp://www.zend.com//code/codex.php?ozid=1323&single=1

纯 Javascript Public/Privatekey 加密 hxxp://shop-js.sourceforge.net/crypto2.htm

一个对 PKI 有用的 FireFox 插件:hxxps://addons.mozilla.org/en-US/firefox/addon/4471 hxxp://www.mozilla.org/projects/security/pki/nss/tools/index.html

在服务器端使用 OpenSSL 的 PHP / 在客户端使用 .NET hxxp://www.csharpbydesign.com/2008/04/asymmetric-key-encryption-with.html

Javascript OpenPGP

hxxp://www.hanewin.net/encrypt/

PS:愚蠢的机制阻止我发布链接......

于 2010-03-10T17:00:30.967 回答
-1

您不在 PHP 中处理 SSL。SSL 由 Web 服务器自动处理。如果您使用的是 Apache,这里有一个简单的教程:

http://www.debian-administration.org/article/Setting_up_an_SSL_server_with_Apache2

这个想法是您像平常一样编写代码,当用户使用 https 访问您的站点时,服务器会自动加密连接。在客户端,浏览器能够使用它已经拥有的私钥来自动解密连接并将代码呈现给用户代理。

希望这可以帮助!

于 2010-01-17T20:57:36.970 回答