2

これは以前に尋ねられたと確信していますが、この問題に答えるものは何も見つかりません。

Spring-security では、パスワード エンコーダーを使用しています。

<beans:bean class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" id="passwordEncoder"/>


    <authentication-manager>
         <authentication-provider user-service-ref='CustomUserDetailsService'>
         <password-encoder ref="passwordEncoder"/>
         </authentication-provider>
    </authentication-manager>

UserDAOImpl 内に、ユーザーを追加するときに次のコードがあります...

@Override
public void addUser(final User user) {
    user.setPassword(passwordEncoder.encodePassword(user.getPassword(), "salt"));
    sessionFactory.getCurrentSession().save(user);
}

パスワードは正しくエンコードされますが、常に無効として読み取られます。これは、Spring が私のソルトが「ソルト」であることをどのように認識するかがわからないため、意味があります。Spring セキュリティと Hibernate に同じソルトを使用するように指示するにはどうすればよいですか? ? 春のセキュリティがパスワードを管理する方法について何か不足していますか?

4

1 に答える 1

4

推奨される方法は、ランダムなソルトを使用する標準のパスワード エンコーダーを使用し、このソルトをダイジェストされたパスワードと共に保存することです。このように、塩を提供する必要はありません。独自のソルトを提供する場合は、ドキュメントで説明されているように、SaltSource を DAO オーセンティケーターに挿入する必要があります(もちろん、パスワードをエンコードして新しいユーザーを作成するときに同じソースを使用します)。

crypto パッケージの StandardPasswordEncoder は、ランダムな 8 バイトのソルトを使用します。これは、パスワードと同じフィールドに保存されます。

ノート

ソルトを処理する従来のアプローチは、SaltSource を DaoAuthenticationProvider に注入することでした。これにより、特定のユーザーのソルト値が取得され、PasswordEncoder に渡されます。ランダム ソルトを使用し、それをパスワード データ フィールドと組み合わせると、ソルト処理の詳細 (値が格納される場所など) について心配する必要がなくなります。これはすべて内部的に行われるためです。そのため、ソルトを個別に保存するシステムがすでに整っていない限り、このアプローチを使用することを強くお勧めします.

あなたの場合、SaltSource は常に「塩」を返します。このソルトの方法は安全ではないことに注意してください。なぜなら、共通のパスワードを共有しているすべてのユーザー (そうです) は同じハッシュ化されたパスワードになってしまうからです。これは、1 人のユーザーのパスワードを見つけた攻撃者が、同じパスワードを共有しているすべてのユーザーのパスワードも見つけてしまうことを意味します。

于 2012-07-07T15:42:32.287 に答える