2011-07-12 12 views
5

Webアプリケーションでサーバーとクライアントの間を行き来するデータを暗号化したいと考えています。 SSLを使用しますが、専用のIPアドレスとともに証明書が必要です。証明書を取得するのに問題はありませんが、専用IPを使用すると、私のWebホストで毎月20ドルのビジネスホスティングプランにアップグレードする必要があります。私は20ドル/年の共有ホスティングプランを守っているので、これを行う計画はありません。SSLの代わりに - "手動で"暗号化する?

SSLの代替案を実装したいと思います。しかし、それはSSLよりも優れています。前後に送信されるデータの暗号化に加えて、データベース内の行も暗号化されます。

JavaScriptのコード::私はこのような何かをやって考えていた

var transfer_key = 'whatever'; 
function encrypt(data, key) {...} 
function decrypt(data, key) {...} 

function send_data_to_server(url, data) 
{ 
    $.post(url, {'data' : encrypt(data, transfer_key) }, function(response) { 
     var decrypted_response = JSON.parse(decrypt(response)); 
    }); 
} 

PHPコード:

あなたが見ることができるように
$data = $_POST['data']; 
$transfer_key = 'whatever'; 
$storage_key = 'whatever2'; 

function encrypt($data, $key) {...} 
function decrypt($data, $key) {...} 

databaseQuery('INSERT INTO table VALUES (?)', encrypt($data, $storage_key)); 

$decrypted_data = decrypt($data, $transfer_key); 
$response = processData($decrypted_data); 

echo encrypt($transfer_key, $response); 

、データクライアントサーバーへの送信は暗号化され、逆もまた同様です。また、データベースのデータも暗号化されています。もちろん、私はそのようなキーを決して実装しません。おそらく、各ユーザーのためにランダムに生成される2番目または3番目のキーがあります。したがって、transfer_keyはrandom_keyと連結されたconstant_keyに等しいことができ、storage_keyにも同じことが起こります。

これはSSLの代替手段ですか?このタイプの暗号化を実装するには、どうすれば敗北するのが難しいのですか?このアプローチには特に弱点がありますか?

おそらく、暗号化を担当するJSライブラリを見つけて、サーバ側でPHPのmcrypt拡張を使用するつもりです。私はBlowfish、おそらくAES256を考えていましたが、どちらが私に暗号化の強さとメモリ消費の比率が最も良いか分かりません。

アドバイス?

+2

私はSSLに専用のIPが必要であることに気づいていません。また、私はこれが擬似コードであることを知っていますが、現時点では、 'DBData = encrypt(encrypt(clientData、transfer_key)、storage_key)' - あなたが示しているように、transfer_keyが何らかの方法で一時的である場合、データベースデータを復号化する。 –

+4

だから私は(攻撃者として)私が行う必要があるのは、暗号化/復号化キーを使ってjavascriptコードを含むクライアントに送信するプレーンhtmlトラフィックを盗聴することだけです。いいです...真剣に、SSL/TLSを貼ってください – NotMe

+1

@Damien_The_Unbeliever:SSL自体はそうではありません。彼の提供者はより高価な計画の一部としてそれを詰め込んでいるかもしれない。 – NotMe

答えて

41

ああ、それで幸運。 TLS specificationを見ましたか?あなたは何百万人もの人々がテストするのに適した何かを考え出すことができると思いますか?

実際、TLSは、このようなプロトコルを壊すこと以外に何もしないような多くの人々によって何年もテストされ、改良されてきました。

SSLはこの分野の専門家によって開発されており、当初はプロトコルが完全に解消できないと考えていました。しかし、その後、バージョン2、3、次にTLS v.1、v1.1、および1.2がありました。

セキュアなプロトコルを設計する経験がない場合は、メインストリームに固執してTLS/SSLを使用する必要があります。

セキュリティは、それが理にかなっていて、実際には主流と一緒に行くのが涼しい、まれな分野の1つなので、追加されたお金がうまくいっていると思います。

編集:

たぶん私は少し厳しいだった、と私はあなたのアプローチは、それでは、それを分析してみましょう、TLSなどのやや複雑なプロトコルと競合することはできません理由として、いくつかの説明を欠いていた:

1)どのように鍵交換をしますか? AESが両端で動作するには、対称暗号化のためにKey Exchangeを実行する必要があります。両方の当事者が同じ鍵を所有する必要があります。あなたが言ったように、あなたはそれをクライアント上で無作為に生成したいと思います。最初の問題 - secure random numberを生成する必要があります。組み込みのJavascript乱数生成器を使用することで、攻撃者はしばらくしてから乱数を予測することができます。

2)あなたがそれを習得したとしましょう。次に、次の問題が発生します。この鍵をサーバーに安全に送信する方法、つまり鍵交換を実行する方法はありますか?

  • は、キーを転送する最初の彼らの不正なサーバにそのキーを送信するに

    • トリックの人々:そこは、そうでない場合はちょうど約誰でもサーバーとして課し、これを行うことができ、サーバー側での認証のいくつかのフォームが必要になりますサーバー
    • にサーバーを忠実に攻撃者がそのデータを傍受し、喜んで、彼らはちょうど
    を盗んだ鍵で復号化することにより、あなたの秘密を読んでいました
  • 確立鍵で暗号化されたデータを送信します

    3)少なくとも、クライアント認証でない場合はサーバー認証が必要です。これは、サーバだけがそれを解読できるように、サーバの公開鍵で鍵を暗号化/ラップするための非対称/公開鍵暗号方式が必要であることを意味します。たぶん、あなたはまた、そのため、一度キーはないPerfect Forward Secrecyをしたいあなたはまだ、このようなreplay attacksman-in-the-middle-attacksreflection attacks、などの攻撃のより複雑な形態が可能であることが習得したら

    4)...

    5)が侵害されると、攻撃者は過去のデータを復号化できなくなります。これを実現するには、Diffie-Hellman(好ましくはElliptic Curve Cryptography形式)が必要です。

    6)最後に、セッションの仕組みがうまくいくので、すでに確立されている対称鍵で以前のセッションを取り上げることができます。これにより、再確立しなくてもサーバの負荷を軽減できますもう少しリソースを消費する公開鍵アルゴリズムを使用します。

    - >クライアントとサーバーの両方でサポートされているアルゴリズムスイートを安全にネゴシエートし、TLSプロトコルを再実装するなど、いくつかの機能を追加します。

    申し訳ありませんが、これはちょっと皮肉だと思いますが、自分の暗号スキームをロールするのも魅力的だと思いますが(それも楽しいですが)、最後にTLSに固執する必要があります。トランスポート層で実行されるため(まったく暗号化されていないかのようにアプリケーションをコーディングできます)、何よりも安全です。

    EDIT:まあ、そこに最近、いくつかの攻撃はあったが、ほぼすべての攻撃は、プロトコルをバックアップする公開鍵証明書(コモド、DigiNotarなどを攻撃することによって、これらのプロトコルでは、「人的要因」を利用しています顕著な例です)またはアルゴリズムネゴシエーションなどのプロトコルのもっと秘密の機能ですが、BEASTは、TLSが暗号レベルで首尾よく攻撃されたのは初めてです。これは同時に興味深く恐ろしいものです。その攻撃は現在some yearsで知られています。

    BEASTの最近の修正により、TLSは、特に手作りのソリューションと比較して、Web上の安全な通信に最適なオプションであることがわかります。

  • +10

    +1:私は暗号化/解読とキーを持つjavascriptコードを見た後、私は読んで停止しました。 – NotMe

    +5

    +1。独自の暗号化方式を書くことに関するルール#1:しないでください。 –

    +0

    もう一度+1したいと思います。素晴らしい書き込み。 – NotMe

    3

    私の助言は、SSL/TLSに固執することです。私は、これがあなたの人生をより楽にし、ソリューション業界に信頼性を認めてくれると考えています。

    DynDNS(または同様のサービス)を静的IPアドレスの代わりに自己署名証明書で使用できますか?

    9

    ライアン:私はこれが最善の方法であることを望んでいます。メモリ消費は、あなたの問題の中でも最も少ないことです。

    これについては何も安全です。何もない。 N.o.t.h.i.n.g

    初めてJavaScriptを送信すると死んでしまった...あなたのキーがどれくらいの長さであるか、塩がどれほどランダムであるかは気にしません。

    あなたが持っているものは、ラップトップを開いたままコーヒーショップに座っている人を止められません。鍵を傍受し、前後に渡すすべてのものを簡単に解読できます。ヘックは、ストリーム内の "暗号化"、 "解読"、 "キー"という言葉を見るだけで、楽しい(または利益)のためにさらに潜るために、誰かの関心を引くのに十分なはずです。開かれた接続を突然見ることは心配しないでください部分のパケットを暗号化し、他の部分をクリアに転送し始めます。

    あなたが持っているものが暗号化する価値があるのなら、それを正しく行うには240ドル/年を追加する価値があります。棚から戻って、ちょうどそれをやり直してください。

    5

    誰もがそう否定的であること、そして私はあなたが個人的には、おそらくこれを実行すべきではないという感情を共有しながら、私はいくつかの一般的な発言を聞かせている。

    あなたは3つのことを必要とするセキュアなチャネルの場合:

    • ラインの暗号化
    • 鍵交換
    • 認証

    暗号化には、暗号を実装する必要があります。それは実行可能です。

    キー交換は重要なポイントです。両方のピアは、共通鍵を知ることができる誰も知らない共通鍵を知っている必要があります。そのためのプロトコルが存在し、それを実装することが可能でなければなりません。たとえば、SSLがそうしています。 SSL接続を盗み見て何も学んでいないという事実は、SSL接続ができていることを示しています。

    man-in-the-middle攻撃を阻止するために認証が必要です。これには、電話通話やPKIインフラストラクチャのような、ある種の帯域外情報交換が必要です。これが実際に実際に動作するかどうかは、SSLの場合でも非常に議論の余地があります。

    基本的にHTTP経由でこれらのコンポーネントを実装できるのであれば、基本的にはHTTP経由で安全な通信を実行できるはずです。結局のところ、SSLは同じことをしています。安全でない媒体を介して安全なチャネルを実行しています。基本的には、JavaScriptでSSLを実装する必要があります。 aSSLをチェックしてみてください。