m-namikiの日記

おもしろき こともなき世を おもしろく

Spring Securityでセキュリティを強化する #2

前回の記事ではアカウントのロックアウトについて考えてみました。今回はパスワードのSalt対応について考えてみます。

パスワードのSaltについてですが、今回は分かりやすくするためにユーザIDをパスワードに追加したものをハッシュ化する、という方法を採ります。
パスワードを保護する場合の方法については、こちらのページが分かりやすいかと。
本当は怖いパスワードの話(1/4) − @IT

SpringSecurityでは、Saltをユーザ情報のプロパティから取るか、システムで共通の値を取るかを指定することができます。
Saltをユーザ情報のプロパティから取得する場合は以下のように記述します。

<authentication-manager>
    <authentication-provider user-service-ref="myUserDetailsService">
        <password-encoder hash="sha-256">
            <salt-source user-property="username"/>
        </password-encoder>
    </authentication-provider>
</authentication-manager>

user-propertyで指定したプロパティの値をリフレクションで取得するので、Userまたはそのサブクラスに存在するプロパティ名を指定する必要があります。

システムで共通の値を指定する場合は以下のように記述します。

<authentication-manager>
    <authentication-provider user-service-ref="myUserDetailsService">
        <password-encoder hash="sha-256">
            <salt-source system-wide="saltedpassword"/>
        </password-encoder>
    </authentication-provider>
</authentication-manager>

今回はユーザIDをパスワードに追加したものをハッシュ化する、という前提なので前者の設定で進めます。
SpringSecurityでSaltを利用してハッシュ化する場合、その基となる文字列は

password{username}

という形式になります。Salt値の前後に「{}」が追加されるのがポイントです。今回の前提で、例えばusernameが「admin」、passwordが「aaaaa」の場合、ハッシュ化するための基の値は

aaaaa{admin}

となります。

SpringSecurityでのSalt対応は以上で終わりです。元々そこまで考えられて作られていたので思った以上に簡単でした。また、MessageDigestPasswordEncoder (Spring Security 3.0.8.RELEASE API)Javadocを読むと@ITのページで紹介されているストレッチングという方法も取り入れることが出来るようなので、パスワードの保護を更に強固にしたい場合はこちらも追加してみると良いかと思います。