5

LAMPhpサーバーで公開鍵を使用して暗号化し、Webクライアントで適切な秘密鍵を使用して復号化することに興味があります(少なくともfirefox、標準のjavascriptである場合に最適です)

私がやりたいことは、SSL/https を使用して暗号化された接続を確立することだけではないことに注意してください。または、ブラウザベースのクライアント証明書をログイン/アクセス制御方法として使用することもできます. 私はそれらの両方を行う方法を知っています。私がやりたいことは、gpg キーを電子メールで送信するようなものです。ユーザーの公開鍵で暗号化する短いメッセージを作成できるようにしたいと考えています。この公開鍵は、ユーザーだけが秘密鍵を使用して復号化できます。私が探しているのは、ssl によって自動的に達成されるプライバシーではなく、特定のユーザーのみがメッセージを復号化できるようにする機能です。これは gpg やおそらく SMIME で簡単に実行できることはわかっています。おそらくそれが最善の方法ですが、Web ベースの代替手段を好むでしょう。

Firefoxなどには証明書ストアがあり、そこに保持されている秘密鍵は、明らかなセキュリティ上の理由からjavascriptにエクスポートできない可能性が高いことはわかっていますが、javascript呼び出しからの証明書を使用して何かを復号化する方法があると思います..

これを行いたい理由は、特定の管理者にランダムに生成されたパスワードを与えるための安全な方法が必要だからです。私は完全なデータベース透過性を実装しようとしていますが、公開鍵暗号化はその取り組みの重要な部分のようです。しかし、これは、この種の能力がないと対処できないユースケースの 1 つです。

したがって、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

この質問をしてからしばらく経ちますが、あなたや他の誰かがこの問題または同様の問題の潜在的な解決策を探している場合は、JavaScriptForgeプロジェクトをチェックする必要があります。

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

このプロジェクトにはJavaScriptでSSLが実装されており、Apacheと通信するときにクライアント側の証明書を含めることができます。関連する秘密鍵(JavaScriptでアクセスできる)を使用して、RSA復号化を手動で行うこともできます。

たとえば、JavaScriptはサーバーに取得/投稿し、クライアント側の証明書を含めることができます。Apacheはこの証明書を読み取り、公開鍵を使用して適切なデータを暗号化し、そのデータをクライアントに返すことができます。次に、クライアントは(JavaScriptの)秘密鍵を使用して情報を復号化し、それを使って何かを行うことができます。ただし、サーバーがクライアント側の証明書を、渡そうとしているシークレットの適切な受信者として認証できる場合は、この追加の暗号化はおそらく必要ありません。

Forgeプロジェクトには、Firefoxまたは他のブラウザーとの間でキーと証明書をインポート/エクスポートするためのシステムを構築するためのAPIもあります(これが何らかの理由でまだ必要な場合)。インポート/エクスポート用の正しい形式(pem => pkcs12)でキー/証明書を取得するには、opensslの助けが少し必要かもしれませんが、これがどのように機能するかの例は、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リンクを参照)はオープンソースです。

于 2010-08-31T15:48:05.950 に答える
2

あなたの言っていることが理解できたので、はっきりとした答えを出すことができます:)

私が言える最善のことは、あなたがしようとしている方法ではまともな暗号化を得ることができないということです. 秘密鍵の暗号化 (つまり RSA) は、非常に非常に大きな数を使用して暗号化を行います。小さい数を使用すると、計算上クラックするのが非常に簡単になり (素数の数は非常に多くなります)、その数は非常に急速に大きくなります。基本的に、RSA では、大きな数を取り、それらを大きな指数にする必要があります。JavaScript は非常に大きな数をサポートできますが、パフォーマンスで壁にぶつかります。512 ビット キーを使用すると、数キロバイトの暗号化に数秒かかる場合がありますが、復号化には数秒から数分かかる場合があります。JS が非常に遅い理由は、単純にコンパイルされた言語ではないからです。確かに、鍵のサイズを小さくすることはできますが、数キロバイトを超えると問題が発生します。

また、RSA は本質的に Web ページでは安全ではありません。これは、プライベート キーが復号化されるデータと一緒に送信され (以前に転送された場合を除く)、ページを受信した人は誰でもデータを復号化できるためです。

ユーザーまたはクライアントから一部のコードを難読化するために、これを実行しようとしていると仮定します。そのため、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-functionsも使いたいと思っていました。私はphp側ですべてが秘密鍵/公開鍵(暗号化/復号化)でうまく機能していることを見てうれしく思い、クライアント側で秘密鍵を使用する方法を見つけたいと思っていました.

!!!

何かありましたら、メールでお知らせください:

pki (で) life.de

!!!

パフォーマンスの面では、大きな部分を対称暗号化で暗号化し、復号化キーのみをクライアントの公開鍵で暗号化して交換します。したがって、多くの 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&single=1

Pure Javascript 公開/秘密鍵暗号化 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 に答える