2012-04-20 13 views
9

春のドキュメントは、私がクッキーに以下の情報を格納することによって実装されて覚えていることを述べている -春のセキュリティ認証管理の脆弱性

base64で(ユーザー名+ ":" + expirationTime + ":" + md5Hex(ユーザー名+ ":" + expirationTime + ":" パスワード+ ":" +キー))

私が持っている以下の混乱 -

  1. 使用する理由SHA-1またはSHA-2を使用する代わりに、MD5のような非安全なハッシュを使用して情報を消化します。このような小さな情報では、これらのパフォーマンスが大幅に低下するでしょうか?

  2. この情報をネットワーク経由で送信する理由は何ですか?暗号化された安全な乱数のマップとこの情報をサーバーに保持して、マップキーのみをクッキーとして返すのはなぜでしょうか。 AFAIKこれはサーブレットAPIによって使用されるアプローチであり、より安全とみなされます。

答えて

10

それはより関連性の一つですので、2番目の質問で始まります:

2番目の質問に答える「なぜ....ですべてネットワーク経由でパスワードを送信」:

をあなたが記述したものは唯一のものなのでSimple Hash-Based Token Approach

Spring Security Reference: Chapter 10 Remember-Me Authenticationのページをスクロールすると、その春のセキュリティが私に近づく別の方法を使用することもできます。Chapter 10.3 Persistent Token Approach。そして、これはあなたの2番目の質問で提案したものです。


最初の質問:短い答えは、「これらのパフォーマンスヒットが情報のような小さな作品のために重要なことですか?」にします - あなたはSimple Hash-Based Token Approachを使用し、MD5は無担保であることを感じるようにしたいのであれば何

、あなたはTokenBasedRememberMeService[javadoc]をサブクラス化しないと​​メソッドをオーバーライドすることができます。たとえば、(未テスト)

+0

SHA-2が壊れているとは思わないので、makeTokenSignature()をオーバーライドするのは良い方法です。どんな場合でも永続的なトークン・アプローチを使用する必要があるのだろうかと思います。 –

+0

永続性のアプローチはずっと安全です。パスワードに関する情報を提供しないと、常に暗号化されたパスワードを送信する方が良いでしょう。 - しかし、この議論は理論的な傾向があります。 - とにかく、永続的なトークンアプローチが好きです。これは、このようなトークンを削除するなどの追加機能を有効にするためです。 – Ralph

+0

永続的なトークンアプローチは明らかに優れていますが、基本的に署名として使用されているこのシナリオでMD5を使用することについて何が安全でないかはわかりません。ハッシュされたパスワードとMD5ハッシュを再現するキーの両方にアクセスする必要があります。 – sourcedelica

4

Simple Hash-Basedトークンで使用されるMD5ハッシュは、そのアプローチの脆弱性ではありません。

パスワードをハッシュするためにMD5を使用すると、既存のパスワードのハッシュ値を指定すると、(虹の表を使用して)同じ値にハッシュする別のパスワードを見つけることができるため、危険です。

ただし、MD5はパスワードをハッシュするために使用されていませんが、MACとして使用されています。レインボーテーブルを使用してそのハッシュと衝突する値を見つけた場合、その値をどの程度正確に使用できますか?

クッキーに異なるハッシュ関数を使用すると、より安全に感じるかもしれませんが、この場合はセキュリティを提供しません。

さらにセキュリティが必要な場合は、Persistent Hashトークン方式を使用する必要があります。シンプルハッシュトークンはユーザ名を平文で公開し、リプレイ攻撃に対して脆弱です。永続トークンは、これらの問題を回避します。

どちらの方法でも、Remember-Me Cookieは、SecureおよびHttp-onlyフラグを設定して保護する必要があります。

+0

(+1)は、Persistent Hashトークンアプローチの賛否を明確に説明しています。これはコメントからの唯一の質問です – Ralph

関連する問題