データアクセス層にSpring&Hibernate(JPA)を備えたJavaアプリケーションスタックでは、パスワード暗号化を適用するための優れた方法は何ですか(できればアノテーションを使用)、どこで詳細を確認できますかそれを成し遂げる(チュートリアルなど)?
パスワードの暗号化に [〜#〜] jca [〜#〜] サポートされているアルゴリズムを使用することは理解されていますが、簡単な方法がある場合はラッパーロジックを実装する必要はありません。 。
私はJasyptを見ていましたが、a)それが良い選択肢であるかどうか、そしてそれをどのように行うか、b)他の人々がこれに何を使用しているか疑問に思いました。誰かがJasyptまたは代替を使用している場合、あなたの経験の詳細は素晴らしいでしょう。
Javaには、必要なすべてのライブラリがすでに用意されています。 [〜#〜] owasp [〜#〜] で説明されているように、ソルトを使用したハッシュを実装するユーティリティメソッドを作成するだけです。
そのコードを本当に所有したくなく、余分な依存関係を気にしないのであれば、 Shiro ライブラリ(以前の JSecurity )には 実装 OWASPによって記述されているものの。
また、あなたが言及したJASYPTライブラリには 同様のユーティリティ があるように見えます。
この回答ではSpringやHibernateについて言及されていないことは理解していますが、このシナリオでそれらをどのように利用したいかはわかりません。
Jasypt with Hibernate を使用して、プロパティをその場で暗号化またはハッシュすることができます。ダイジェスト(ハッシュ)を計算するための実際のアルゴリズムは、独自のアルゴリズムも使用する場合は、JCEを使用すると非常に簡単です。
MD5は現在クラック可能ですが、MD5またはSHA-256で問題ありません。
問題を誤解したかもしれませんが、ハッシュ化されたパスワードを比較しているだけです。
Hibernateでは、文字列として保存するだけです。検証側では、次のような方法があります。
public validate(String user, String pass)
{
if(getUser(user).getPass().equals(getHash(pass)))
return true;
return false;
}
アプリケーションでSpringを使用している場合は、 Spring Security を使用することもできます。これにより、いくつかのパスワードエンコーダーが提供されます。つまり ShaPasswordEncoderで見つけることができます) StackOverflow
Jasyptでそれを行うHibernate固有の方法はないようですが、Springでパスワード暗号化を設定できます。
<!--
Set up string digester here so we can configure it for more pools if it's a problem...
-->
<bean id="stringDigester" class="org.jasypt.digest.PooledStringDigester">
<!-- same settings as StrongPasswordGenerator -->
<property name="poolSize" value="2"/>
<property name="algorithm" value="SHA-256"/>
<property name="iterations" value="100000"/>
<property name="saltGenerator">
<bean class="org.jasypt.salt.RandomSaltGenerator"/>
</property>
<property name="saltSizeBytes" value="16"/>
</bean>
<!-- ...and then we only have to deal with the passwordEncryptor interface in code. -->
<bean id="passwordEncryptor" class="com.myproject.util.StringPasswordEncryptor">
<property name="stringDigester" ref="stringDigester"/>
</bean>
その後、context.getBean( "passwordEncryptor")を呼び出して暗号化ツールを取得し、encryptPassword()またはcheckPassword()を呼び出します。
SHA-256(username + ":" + password + ":" + salt)
に似たものを使用して、データベースのpasswdという64文字の列に格納します。
ウィキペディアは、ソルトに関して次のように述べています。「ソルトデータは、辞書エントリの事前暗号化を使用する辞書攻撃を複雑にします。使用されるソルトの各ビットは、必要なストレージと計算の量を2倍にします。..最高のセキュリティのために、ソルト値は秘密にされます。パスワードデータベースとは別に。これは、データベースが盗まれた場合に利点がありますが、ソルトは盗まれません。」
したがって、認証するには、指定されたユーザー名でデータベースからユーザーを取得し、ログイン試行で提供されたパスワードを使用して同じハッシュを生成し、データベース内のハッシュと比較します。また、ログイン試行のレート制限を追加します(たとえば、5分間に5回)。ユーザーがパスワードを忘れた場合は、パスワードを電子メールで送信しないでください(保存されないため)。また、新しく生成されたパスワードを電子メールで送信しないでください。ただし、パスワードの変更キー/ノンス/ソルトを使用して、パスワードを変更するためのリンクを電子メールで送信してください。確認できるURL。