web-dev-qa-db-ja.com

Spring / Hibernateを使用したパスワード暗号化-Jasyptまたは他の何か?

データアクセス層にSpring&Hibernate(JPA)を備えたJavaアプリケーションスタックでは、パスワード暗号化を適用するための優れた方法は何ですか(できればアノテーションを使用)、どこで詳細を確認できますかそれを成し遂げる(チュートリアルなど)?

パスワードの暗号化に [〜#〜] jca [〜#〜] サポートされているアルゴリズムを使用することは理解されていますが、簡単な方法がある場合はラッパーロジックを実装する必要はありません。 。

私はJasyptを見ていましたが、a)それが良い選択肢であるかどうか、そしてそれをどのように行うか、b)他の人々がこれに何を使用しているか疑問に思いました。誰かがJasyptまたは代替を使用している場合、あなたの経験の詳細は素晴らしいでしょう。

17
stevedbrown

Javaには、必要なすべてのライブラリがすでに用意されています。 [〜#〜] owasp [〜#〜] で説明されているように、ソルトを使用したハッシュを実装するユーティリティメソッドを作成するだけです。

そのコードを本当に所有したくなく、余分な依存関係を気にしないのであれば、 Shiro ライブラリ(以前の JSecurity )には 実装 OWASPによって記述されているものの。

また、あなたが言及したJASYPTライブラリには 同様のユーティリティ があるように見えます。

この回答ではSpringやHibernateについて言及されていないことは理解していますが、このシナリオでそれらをどのように利用したいかはわかりません。

7
laz

Jasypt with Hibernate を使用して、プロパティをその場で暗号化またはハッシュすることができます。ダイジェスト(ハッシュ)を計算するための実際のアルゴリズムは、独自のアルゴリズムも使用する場合は、JCEを使用すると非常に簡単です。

5
Kevin

MD5は現在クラック可能ですが、MD5またはSHA-256で問題ありません。

問題を誤解したかもしれませんが、ハッシュ化されたパスワードを比較しているだけです。

Hibernateでは、文字列として保存するだけです。検証側では、次のような方法があります。

public validate(String user, String pass)
{
    if(getUser(user).getPass().equals(getHash(pass)))
        return true;
    return false;
}
2
Jesse

アプリケーションでSpringを使用している場合は、 Spring Security を使用することもできます。これにより、いくつかのパスワードエンコーダーが提供されます。つまり ShaPasswordEncoderで見つけることができます) StackOverflow

2
mwojtera

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()を呼び出します。

2
Will Sargent

SHA-256(username + ":" + password + ":" + salt)に似たものを使用して、データベースのpasswdという64文字の列に格納します。

ウィキペディアは、ソルトに関して次のように述べています。「ソルトデータは、辞書エントリの事前暗号化を使用する辞書攻撃を複雑にします。使用されるソルトの各ビットは、必要なストレージと計算の量を2倍にします。..最高のセキュリティのために、ソルト値は秘密にされます。パスワードデータベースとは別に。これは、データベースが盗まれた場合に利点がありますが、ソルトは盗まれません。」

したがって、認証するには、指定されたユーザー名でデータベースからユーザーを取得し、ログイン試行で提供されたパスワードを使用して同じハッシュを生成し、データベース内のハッシュと比較します。また、ログイン試行のレート制限を追加します(たとえば、5分間に5回)。ユーザーがパスワードを忘れた場合は、パスワードを電子メールで送信しないでください(保存されないため)。また、新しく生成されたパスワードを電子メールで送信しないでください。ただし、パスワードの変更キー/ノンス/ソルトを使用して、パスワードを変更するためのリンクを電子メールで送信してください。確認できるURL。

0
JeeBee