春のセキュリティのパスワードハッシングの例

Spring Securityのパスワードハッシュの例

このチュートリアルでは、BCryptPasswordEncoderを使用してパスワードをハッシュし、SpringSecurityでログイン認証を実行する方法を示します。

昔は、通常、MD5Md5PasswordEncoderまたはSHAShaPasswordEncoderハッシュアルゴリズムを使用してパスワードをエンコードしていました…引き続き好きなエンコーダーを使用できますが、SpringではBCryptを使用することをお勧めしますBCryptPasswordEncoder、ランダムに生成されたソルトを使用したより強力なハッシュアルゴリズム。

使用される技術:

  1. Spring 3.2.8.RELEASE

  2. Spring Security 3.2.3.RELEASE

  3. Spring JDBC 3.2.3.RELEASE

  4. 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.example.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. データベース

テーブルを作成し、テスト用のユーザー「例」を挿入します。

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 ('example','$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.', true);

INSERT INTO user_roles (username, role)
VALUES ('example', 'ROLE_USER');
INSERT INTO user_roles (username, role)
VALUES ('example', 'ROLE_ADMIN');

4. パスワードエンコーダーを有効にする

XML構成でパスワードエンコーダーを有効にするいくつかの方法。

4.1 Using the default BCryptPasswordEncoder.

spring-security.xml

  
    
        
    
  

4.2 Pass a "strength" parameter to the BCryptPasswordEncoder.

spring-security.xml

  
    
        
    
  

  
    
  

4.3 Pass an encoder to DaoAuthenticationProvider.

spring-security.xml

  
    
    
  

  

4.4 Annotation example.

@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-encoder

データベース内のユーザーとパスワード。

spring-security-password-encoder-database

ソースコードをダウンロード

ダウンロード-spring-security-password-hashing.zip(18 KB)

ダウンロード-spring-security-password-hashing-annotation.zip(22 KB)