2010-11-23 23 views
9

私が取り組んでいるjavascriptアプリケーションを安全にする方法を研究しています。アプリケーションは、APE(Ajax Push Engine)をバックエンドとして使用するチャット・クライアントです。hmacでjavascriptクライアントをセキュリティで保護

現在、誰でもページにアクセスしてAPEサーバーにGET/POSTリクエストを行うことができます。私は登録ユーザーにチャットクライアントを提供したいだけです。彼らの要求だけが受け入れられるようにしたいと思います。 PHPでユーザ名/パスワード認証を使用して、ユーザにページを提供することができます。しかし、一度彼らはページを持っている、彼らはJavaScriptを変更したり、それが間違った手に落ちるのを止めるのですか?クライアント/サーバ・アプリケーションを保護するためのこの方法は有望に見える

http://abhinavsingh.com/blog/2009/12/how-to-add-content-verification-using-hmac-in-php/

私はそれが秘密鍵を送信するに依存しないため、これはjavascriptのクライアントのために理想的であると言い、別のソースを持っています。しかし、これはどうやってできますか?上記のチュートリアルによれば、クライアントは秘密鍵を提供する必要があります。これは、javascriptを持っている人なら誰もそのユーザーの秘密鍵を持っているので、あまり安全ではないようです。私が理解から、それはこのような何かを動作します:

  1. ユーザーログを
  2. PHPは、ユーザー名とパスワードを検証し、ユーザー名とパスワードを使用して、ユーザの秘密鍵を検索し、JavaScriptの中にそれを挿入
  3. Javascriptは署名(秘密鍵を使用)とすべてのAPE要求の公開鍵を提供します
  4. APEは、計算された署名と受信した署名を比較し、要求を処理するかどうかを決定します。

javascriptアプリケーションが秘密鍵を認識する必要がある場合、これはどのように安全ですか?

ありがとうございました!

+1

こんにちはWalderman、ここからの投稿への参照元は、この機会をブログの記事で説明されている作業を説明するようにしましょう。説明されたメソッドは、フロー検証メソッドです。つまり、呼び出されたajax/javascript/apiがアプリケーション制御フローを介して実際に意図されていることを確認したい場合です。クラム情報がサーバー側にないか、タイムアウトや破損のために無効な場合は、単にコールを無視してください....それが作業をクリアすることを願っています。説明されたメソッドは、クライアント側で秘密鍵を送信するように求めません。 –

答えて

0

サードパーティが接続しようとしているAPIの方がHMAC認証が優れています。クライアントのブラウザに認証されたことを示すCookieを書き込むことで、アプリの利用率が向上するようです。その後、各Ajaxリクエストで、そのCookieを確認できます。

編集:私は、HMACがサードパーティ製のAPIでよりうまく機能していると言ったことを少し取り返します。伝統的にHMACでは、各ユーザーはそれぞれ独自の秘密鍵を取得します。私はこれがあなたのアプリケーションに必要とは思わない。おそらく、1つのマスター秘密鍵を保持し、各ユーザーに一意の「公開」キー(私はそれを公開キーと呼んでいますが、実際にはユーザーはそのキーについて知ることはありません)を与えるだけです。ユーザーがログインすると、2つのCookieが書き込まれます。ユーザの公開鍵+暗号化されたタイムスタンプと、タイムスタンプが何であるかを示す別の鍵との組み合わせであるもの。次にサーバー側で、暗号化されたキーを検証し、タイムスタンプが所定のしきい値内にあることを確認できます(アプリでアイドル状態になっている場合は10〜30分)。検証されている場合は、暗号化されたキーとタイムスタンプ、リンス、リピートを更新します。

+1

ありがとうございます。たぶん私は何かが欠けているかもしれませんが、不要なユーザーがこのCookieを検出してからリクエストを送信するのを止めるのはどうですか? – Walderman

+0

ユーザーはCookieを表示する可能性がありますが、ドメインに属していない限り、同じCookieをドメインに書き込むことはできません。あなたがそれを心配しているなら、HMACを使用して、公開鍵と秘密鍵を使用して暗号化されたタイムスタンプの組み合わせを書くことができます。この方法では、秘密鍵はjavascriptまたはクッキーによって公開されることはありません。 – roto

+0

ここでコンセンサスのように私はいくつかの種類のクッキー/トークン/キーを設定し、各Ajaxリクエストで送信する必要があると思われます。クッキーを使用する場合と、クエリ文字列に値を含める場合がありますか?クッキーを使用するように見えるかもしれませんが、クライアントがクッキーを無効にすると、私のアプリケーションは動作しません。 – Walderman

2

答え:技術的にはcannot prevent the user from modifying the JavaScriptです。あなたはそれについて何もできないので、心配しないでください。

ただし、防御する必要がある攻撃はCross-Site Request Forgery(CSRF)です。異なるドメインにある悪意のあるスクリプトは、ブラウザに保存されたCookieを使用して自動的にフォームをドメインに送信することができます。それに対処するには、AJAXリクエストで送信された実際のデータに認証トークン(十分にランダムで、ユーザー名やパスワードに関係なく、チャットクライアントが存在するHTMLページで送信される)を含める必要がありますブラウザによって自動的に入力されません)。

+0

これは、OAuthのようなものです。サーバが認証してから、x時間の間、クライアントにアクセストークンを提供します。 – Walderman

+0

@Walderman:OAuthほど複雑である必要はありません。私が話しているのは、HTMLページやサーバーの最初のAJAXレスポンスのいずれかに認証トークン(Cookieで使用されているものなど)を入れておき、その後のすべての応答をチェックして、クッキー以外の方法*その他*)。 – PleaseStand

1

javascriptアプリケーションが秘密鍵を認識する必要がある場合、このセキュリティはどのように安全ですか?

どうしてですか?それはユーザー自身の秘密鍵です。もし彼が他の人にそれを与えたいなら、それは彼の問題です。あなたのパスワードを与えてから、他の誰かがあなたのアカウントにアクセスできると言っても変わりません。

これについて少し考えてみると、公開鍵暗号化、HMACなどを実装する必要はないことが分かります。通信チャネル自体が安全である(HTTPSを使用しているなど)場合、通常のセッションベースの認証が行われます。

+0

ajaxリクエストを受け取ったAPEサーバーがHTTPSで保護されていても、引き続き誰でもhttps:///0.ape.mydomain.comにアクセスしてデータを送信できます。現在、彼らはそれを行うために認証される必要はありません。 APEサーバーはPHPセッションを認識していないため、クライアントのIDを確認するには別の方法が必要です。 – Walderman

+0

@Walderman:その場合、PHPにランダムに生成された一時キーをクライアントに送信させ、クライアントからAPEにリクエストごとにこれを送信させます。 PHPとAPEの両方がアクセスできるように、このキーをデータベースに格納する必要があります。 – casablanca

関連する問題