2011-12-04 9 views
2

私はAppEngineでRESTサービスを実行しています(これは関係ないかもしれません)。各RESTリクエストにはユーザーIDとパスワードが付いています。各リクエストの開始時に、パスワードをハッシュして、処理前に自分のレコードと一致するかどうかを確認します。複数のリクエストに対する効率的なパスワードのハッシュ

これは理論的にはうまくいきますが、実際にはユーザーからのリクエストが4秒または5秒ごとに発生します。 BCrypt 500msで各リクエストのパスワードをハッシュします。どのような無駄です!

明らかに、私は、BCryptの時間を最適化したくありません。ハッシュをキャッシュする標準的な方法はありますか? memcacheは、最近ハッシュされたパスワードとそのハッシュのテーブルを保存する安全な場所ですか?私はその時点でMemcacheにユーザーの平文のパスワードを保存することもできると思います。私は500msのハッシュの代わりに3msのmemcacheルックアップをしたいと思いますが、セキュリティは最優先です。何らかのセッション抽象化を実装する方が理にかなっていますか?

アドバイスありがとうございます!

追加のコンテキスト用の編集:これは機密文書の学生データ(等級)を保存する等級表アプリケーションです。教師と生徒はWi-Fiなどのあらゆる場所からログインします。成功したリクエストはすべてhttpsで送信されます。

+0

Google Appsエンジンの操作が長続きするほど基本的なものではないと期待しています...セッションクッキーを発行するのはかなり標準的ですが、安全な接続でなければ盗難/ハイジャックの対象となります...あなたのアプリケーションに関するもう少しコンテキストが、おそらくpplがより有用な答えを出すのを助けるでしょう - あなたの容認できる公差は何ですか...これは銀行のアプリケーションですか? (Googleのアプリケーションでホストされているのであれば疑問だが、理論的な質問...):) – Nathan

+0

@Nathan:ここで問題の一部は、bcryptが遅いと思われることです* http://en.wikipedia.org/ wiki/Key_stretching)。しかし、Rhuideanによれば、パスフレーズを使って、(a)大きい、(b)ランダムな、(c)短命のセッションキーを確立することができます。したがって、オンラインでもブルートフォースでも攻撃者が何らかの形でセッション鍵の格納されたハッシュを取得した場合、サーバを要求またはオフラインでフラッディングします。だから、パスフレーズよりもセッションキーのハッシュのラウンド数を減らすことができます。ほとんどの場合、ゼロラウンドを使用でき、プレーンなセッションキーを保存することができます。 –

+0

@Nathan:OPで探していたコンテキストを追加しました。@SteveJessopというセッションキー用のより速いハッシュについて考えてくれてありがとう。私はこのルートに行くとおそらくゼロを使うだろうと思っていますが、難しさを調整することは考えていませんでした。 –

答えて

1

あなたの現在の方法では、試行されたパスワードをmemcacheのbcrypted形式にマッピングすることをお勧めします。 memcacheに平文のパスワードを保存する理由がある場合は、代わりにmd5またはsha1ハッシュをキーとして使用してください。

追加の手順は実際には必要ありません。 memcacheに保存されたアイテムは他のアプリに漏れません。

+0

私がチェックするのは、「Memcacheの機密データは、私のアプリケーションを実行するプロセスのメモリ内の機密データよりも漏れの可能性がありますか?」です。答えが「いいえ」(かなり可能性が高いと思われる)の場合、パスワードをキャッシュすることは、それをまったく処理することよりも悪くありません。答えが「はい」の場合、リスクの差が気になる閾値を超えているかどうかを判断する必要があります。 –

+0

答えをありがとう、Dave!私は先に進んでこれを実装し、ほぼすべてのリクエストで500msの短縮を見ました。これはリクエストによっては95%のスピードアップと同じもので、APIのクライアントにとっては透過的です。今日の請求情報を見ることに興奮しています;) –

2

REST APIの通常の経験則は、完全にステートレスのままにすることですが、と同様にgotoのように、要件に応じて時間と場所があります。クライアントが一時的なセッション鍵を保存するという考えに反論していない場合は、一時的にセッション鍵を再生成する必要があります。

クライアントがリクエストを行うときに、ユーザーがユーザーIDとパスワードと共にセッションキー変数を送信しているかどうかを確認します。そうでない場合は、現在のサーバー時刻とパスワードに基づいてパスワードを生成し、クライアントに渡します。作成時間とともに自分のデータベースに保管します。次に、クライアントがセッション鍵を含む要求を行うと、ハッシュを必要とせずに、データベースに格納されているセッション鍵と直接比較することで検証できます。数時間ごとに鍵を無効にする限り、セキュリティ上の懸念はあまりないはずです。あなたが現在パスワードとユーザーIDをクリアで送信している場合は、既にセキュリティ上の問題があります。

+1

"ハッシュを必要とせずに" - またはそれが心配な場合は、EKSBlowfishよりもはるかに高速なハッシュを使用してください。 –

+0

私はセッションキーをオプションにすることができますが、クライアントのAPIのステートレス性を維持するために、クライアントがセッションを高速化するためにセッションを使用できるようにすることができます。提案していただきありがとうございます。私が好きでないのは、特別な/獲得リクエスト、またはレスポンスの特別な情報が必要なことだけです。 ps:すべてのリクエストをhttpsで送信し、ユーザーID /パスワードのCookieに安全とマークされているので、決して送信されません。 –

+0

XML/JSON形式またはその他のリレーショナル形式でデータを返す場合は、レスポンスにセッションキーを含めることをお勧めします。ただし、最初の認証時またはセッションキーが期限切れになったときにのみ行う必要があります。これはサーバーの負荷に基づいて制御できる期間です。 – wrren

関連する問題