春のセキュリティのパスワードハッシングの例
このチュートリアルでは、 `BCryptPasswordEncoder`を使用してパスワードをハッシュし、Spring Securityでログイン認証を実行する方法を説明します。
昔、通常、パスワードをエンコードするためにMD5の
Md5PasswordEncoder`やSHAの
ShaPasswordEncoder`ハッシュアルゴリズムを使用しました…あなたはどんなエンコーダでも使用できますが、http://en.wikipediaを使用することをお勧めします.org/wiki/Bcrypt[BCrypt]`BCryptPasswordEncoder`は、ランダムに生成されたsaltを持つ強力なハッシングアルゴリズムです。
使用される技術:
-
Spring 3.2.8.RELEASE
-
春のセキュリティ3.2.3.RELEASE
-
Spring JDBC 3.2.3.RELEASE
-
MySQLサーバ5.6
1. PasswordEncoderを見直す
使い慣れた古い認証の `PasswordEncoder`インターフェースは廃止されました…
package org.springframework.security.authentication.encoding; //Implementation : Md5PasswordEncoder and ShaPasswordEncoder @Deprecated public interface PasswordEncoder {
代わりに、この新しい暗号 “PasswordEncoder”インタフェースを使用する必要があります。
package org.springframework.security.crypto.password; //Implementation : BCryptPasswordEncoder public interface PasswordEncoder {
2. BCryptパスワードを生成する
まず、パスワードをハッシュしてデータベースに入れ、後でログイン認証を行います。この例では、 “ BCryptPasswordEncoder`を使用してパスワード “123456”をハッシュします。
PasswordEncoderGenerator.java
package com.mkyong.web.controller; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; public class PasswordEncoderGenerator { public static void main(String[]args) { int i = 0; while (i < 10) { String password = "123456"; BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String hashedPassword = passwordEncoder.encode(password); System.out.println(hashedPassword); i++; } } }
BCryptハッシュアルゴリズムでは、毎回長さ60の異なるハッシュ値が生成されます。
$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8. $2a$10$trT3.R/Nfey62eczbKEnueTcIbJXW.u1ffAo/XfyLpofwNDbEB86O $2a$10$teJrCEnsxNT49ZpXU7n22O27aCGbVYYe/RG6/XxdWPJbOLZubLIi2 $2a$10$BHG59UT6p7bgT6U2fQ/9wOyTIdejh4Rk1vWilvl4b6ysNPdhnViUS $2a$10$W9oRWeFmOT0bByL5fmAceucetmEYFg2yzq3e50mcu.CO7rUDb/poG $2a$10$HApapHvDStTEwjjneMCvxuqUKVyycXZRfXMwjU0rRmaWMsjWQp/Zu $2a$10$GYCkBzp2NlpGS/qjp5f6NOWHeF56ENAlHNuSssSJpE1MMYJevHBWO $2a$10$gwbTCaIR/qE1uYhvEY6GG.bNDQcZuYQX9tkVwaK/aD7ZLPptC.7QC $2a$10$5uKS72xK2ArGDgb2CwjYnOzQcOmB7CPxK6fz2MGcDBM9vJ4rUql36 $2a$10$6TajU85/gVrGUm5fv5Z8beVF37rlENohyLk3BEpZJFi6Av9JNkw9O
塩がランダムに生成されるため、BCryptで値をハッシュするたびに異なる値を取得するのは正常です。このチュートリアルでは、最初の出力を取得してデータベースに挿入します。
3.データベース
テスト用にテーブルを作成し、ユーザ「mkyong」を挿入します。
CREATE TABLE users ( username VARCHAR(45) NOT NULL , password VARCHAR(60) NOT NULL , enabled TINYINT NOT NULL DEFAULT 1 , PRIMARY KEY (username)); CREATE TABLE user__roles ( user__role__id int(11) NOT NULL AUTO__INCREMENT, username varchar(45) NOT NULL, role varchar(45) NOT NULL, PRIMARY KEY (user__role__id), UNIQUE KEY uni__username__role (role,username), KEY fk__username__idx (username), CONSTRAINT fk__username FOREIGN KEY (username) REFERENCES users (username)); INSERT INTO users(username,password,enabled) VALUES ('mkyong','$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.', true); INSERT INTO user__roles (username, role) VALUES ('mkyong', 'ROLE__USER'); INSERT INTO user__roles (username, role) VALUES ('mkyong', 'ROLE__ADMIN');
4.パスワードエンコーダを有効にする
XMLエンコーディングでパスワードエンコーダを有効にするには、いくつかの方法があります。
4.1デフォルトの
BCryptPasswordEncoder
の使用。
spring-security.xml
<authentication-manager> <authentication-provider> <password-encoder hash="bcrypt"/> </authentication-provider> </authentication-manager>
4.2 “strength”パラメータを
BCryptPasswordEncoder
に渡す。
spring-security.xml
<authentication-manager> <authentication-provider> <password-encoder ref="encoder"/> </authentication-provider> </authentication-manager> <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> <beans:constructor-arg name="strength" value="11"/> </beans:bean>
4.3エンコーダを
DaoAuthenticationProvider
に渡す。
spring-security.xml
<bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="customUserService"/> <property name="passwordEncoder" ref="encoder"/> </bean> <bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
4.4注釈の例。
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired DataSource dataSource; @Autowired public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .passwordEncoder(passwordEncoder()) .usersByUsernameQuery("sql...") .authoritiesByUsernameQuery("sql..."); } @Bean public PasswordEncoder passwordEncoder(){ PasswordEncoder encoder = new BCryptPasswordEncoder(); return encoder; }
5.プロジェクトデモ
パスワードで保護されたページにアクセスする:
localhost:8080/spring-security-password-hashing/admin
、ログインページが表示されます。パスワード “123456”を入力すると、Spring Securityはパスワードをハッシュし、データベースのハッシュパスワードと比較します。
データベース内のユーザーとパスワード。
ソースコードをダウンロードする
ダウンロード:
spring-security-password-hashing.zip
(18 KB)
ダウンロード:
spring-security-password-hashing-annotation.zip
(22 KB)
参考文献
JavaDoc]。
http://docs.spring.io/spring-security/site/docs/3.2.3.RELEASE/reference/htmlsingle/#nsa-password-encoder
[Spring
セキュリティリファレンス:パスワードエンコーダ]
リンク://タグ/bcrypt/[bcrypt]リンク://タグ/ハッシュ/[ハッシング]
パスワード
spring
セキュリティ