我感兴趣的是我在LAMPhp服务器上使用公钥加密,使用Web客户端上的相应私钥解密(至少是firefox,如果是标准的javascript则最好)
请注意,我想要做的是 - 不仅仅是使用SSL / https进行加密连接。甚至使用基于浏览器的客户端证书作为登录/访问控制方法。我知道如何做这两件事。我想做的更像是用gpg键发送电子邮件。我希望能够创建一条短消息,我将使用用户公钥加密 - 只有他们可以使用他们的私钥解密。我正在寻找的不是ssl自动实现的隐私,而是仅允许特定用户解密消息的能力。我知道我可以用gpg或SMIME轻松做到这一点,也许这是最好的方法,但我更喜欢基于网络的替代方案。
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>";
?>
请注意,我通过stackedoverflow找到了许多优秀的javascript加密库...但我实际上想要使用根据MyOpenId.com或CaCert.org导入Firefox的密钥
有人知道这是否可行?
谢谢, -FT
答案 0 :(得分:3)
自从您提出这个问题已经有一段时间了,但如果您或其他任何人正在寻找此问题或类似问题的潜在解决方案,他们应该查看JavaScript Forge项目:
http://github.com/digitalbazaar/forge/blob/master/README
此项目在JavaScript中具有SSL实现,允许您在与Apache通信时包含客户端证书。您还可以使用关联的私钥(您可以在JavaScript中访问)手动执行RSA解密。
例如,JavaScript可以获取/发布到服务器并包含其客户端证书。 Apache可以读取此证书,使用公钥加密适当的数据,然后将该数据返回给客户端。然后,客户端可以使用其私钥(在JavaScript中)并解密信息并对其执行某些操作。但是,如果您的服务器可以将客户端证书验证为您尝试传递的秘密的适当接收者,则可能甚至不需要这种额外加密。
Forge项目还有API来构建一个系统,用于向/从Firefox或其他浏览器导入/导出密钥和证书(如果出于某种原因仍然需要这样做)。可能需要openssl的一些帮助才能使密钥/证书以正确的格式导入/导出(pem =&gt; pkcs12),但是在基于JavaScript的WebID演示中可以找到一些如何工作的示例。 WebID是基于客户端证书的身份验证系统:
WebID管理演示:https://webid.digitalbazaar.com/manage/
WebID身份验证演示:https://payswarm.com/webid-demo/
请注意,上述网站的SSL证书是自签名的,需要将临时例外添加到浏览器中才能查看。这些网站不要求您输入任何个人信息,仅用于演示目的。但是,如果你转到第一个链接,你可以在浏览器中生成密钥(它使用Forge JavaScript来执行此操作),然后您可以在顶部的列表中看到以PEM格式生成的私钥和证书的页面。密钥和证书通过Flash本地存储保留。
WebID管理网站的来源几乎100%(如果不是那样)是可见的,因为它主要是JavaScript。此外,Forge项目本身(参见github链接)是opensource。
答案 1 :(得分: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
希望你对自己想做的事情感到满意!
答案 2 :(得分:1)
我正在搜索你做的完全相同的事情,并且也想使用php的openssl函数。 我很高兴地看到在phpside上,一切都使用私钥/公钥(加密/解密),并且现在想要找到一种在客户端使用privatekey的方法。
!!!
如果您发现任何问题,请通过电子邮件告知我们:
pki(at)life.de
!!!
对于表现方面: 您可以使用symetric加密加密大部件,只使用客户端公钥的解密密钥来加密它。所以你不需要知道许多kb。
但它似乎是firefox的死胡同,但有了IE和ActiveX似乎可能 CAPICOM(我现在对它的了解并不多)。 hxxp://geekswithblogs.net/shahed/archive/2007/05/03/112232.aspx
但是对于JavaScript / PHP来看看(并阅读FAQ和其他页面上的所有评论!未来可能会提到双向通信): hxxp://www.jcryption.org/
hxxp://www.zend.com//code/codex.php ozid = 1323&安培;单= 1
?Pure Javascript Public / Privatekey加密 hxxp://shop-js.sourceforge.net/crypto2.htm
PKI的一个有用的FireFox-Addon: hxxps://addons.mozilla.org/en-US/firefox/addon/4471 hxxp://www.mozilla.org/projects/security/pki/nss/tools/index.html
在CLientside上的Serverside / .NET上使用OpenSSL的PHP hxxp://www.csharpbydesign.com/2008/04/asymmetric-key-encryption-with.html
Javascript OpenPGP
hxxp://www.hanewin.net/encrypt/
PS:愚蠢的机制阻止我发布链接......
答案 3 :(得分:-1)
您不在PHP中处理SSL。 SSL由Web服务器自动处理。如果你正在使用Apache,这里有一个简单的教程:
http://www.debian-administration.org/article/Setting_up_an_SSL_server_with_Apache2
我们的想法是您像平常一样编写代码,当用户使用https访问您的网站时,服务器会自动加密连接。在客户端,浏览器能够使用已有的私钥自动解密连接并将代码呈现给用户代理。
希望这有帮助!