私は、フロントエンドに純粋な JavaScript を使用し、RESTful AJAX 呼び出しを介してデータの Web サービスにアクセスする、サービス指向アーキテクチャを利用する新しいサイトに取り組んでいます。
特に重要ではありませんが、私のスタックは次のとおりです。
- javascriptMVC
- jQuery
- ブートストラップ
- ASP.NET Web API (.NET 4.0 上の C#)
- MSSQL
この記事から、クライアント (JavaScript) とサーバー (Web API を介した REST サービス) の間で秘密鍵を共有すると、Web サービス呼び出しを保護するための良い方法がいくつかわかりました。ただし、暗号化に使用する秘密鍵を確立する方法に苦労しています。
悪い考え #1
ただし、最初は、HTTPS 経由で発生するログイン時に設定し、再利用のためにクライアントの Cookie に保存することでした。問題は、私たちのサイトがhttp://www.example.comにあるのに、私たちの SSL 証明書はhttps://secure.example.com用であるため、secure.example.com Cookie にアクセスできないことです。 www.example.com から。
悪い考え #2
次に考えたのは、次のように、HTTPS ログインから HTTP ポストログイン ページに URL パラメータを介して暗号化および署名して渡すことでした。
http://www.example.com/processLogin?key=[encryptedKey]&sig=[encryptedSig]&user=[userid]
encryptedKey と encryptedSig は両方とも、そのトランザクションのためだけに存在する別の秘密鍵で暗号化されます。ログイン時に作成され、データベース内のそのユーザーに割り当てられます。HTTP 側では、これらすべてがサーバーに渡され、サーバーはそれを復号化し、署名を検証し、その秘密鍵を削除し (リプレイ攻撃から保護するため - 基本的にnonce )、復号化された秘密鍵 ([encryptedKey]
復号化されたもの) を返します。
それ以降、復号化された値は、[encryptedKey]
将来のすべてのトランザクションに使用されます。問題は、復号化された秘密鍵を HTTP 経由で回線経由で送信する必要があることです。
悪い考え #3
また、この値を復号化するために使用される JavaScript にハードコードされたキーがあることも簡単に思いつきましたが、どのように難読化しようとしても、ハッカーに発見されて使用される可能性があります。
悪い考え #4
また、最初のハンドシェイクで公開鍵暗号を使用するある種のキー交換も検討しましたが、他の場所で述べたように、クライアント側では、最初のハンドシェイクが終了しない限り、改ざんがないと確信することはできません。 SSL - 振り出しに戻ります。
大きな疑問
では、 HTTPSを介さずにすべてを管理するにはどうすればよいでしょうか。この秘密鍵を Cookie に保存するには、HTTP と HTTPS で同じドメイン名を使用する必要がありますか?
サイトの非 SSL 部分では、クレジット カードやログイン情報などは共有されないことに注意してください。この吸盤を大きく開いたままにしたくないだけです。