[PostgresSQL]パスワードを暗号化して保存するSQL


ユーザー登録するときに、データベースにパスワードを保存しますが、パスワードは暗号化されている必要があります。

Postgresでパスワードを暗号化する方法を調べました。

1.スーパーユーザで対象のデータベースに入り、以下のコマンドを実行してpostgresの暗号化モジュールを入れる。

CREATE EXTENSION pgcrypto;

2.以下のようなSQLでパスワードを暗号化する。

INSERT INTO users(user_id,passwd) VALUES('testuser',crypt('testuser',gen_salt('bf',10)));

crypt関数には、第一引数に暗号化したい文字列、第二引数にgen_salt(暗号化に使用するアルゴリズム、ソルトのハッシュ化のラウンド数(暗号強度みたいなもの))を指定。
‘bf’と指定するとBlowfishというアルゴリズムで暗号化を行います(BCrypt)。

Spring Securityでお世話になるBCryptPasswordEncoderは、コンストラクタに何も指定していなければソルトのハッシュは10が指定される。
当然、APサーバ側とDBサーバで使用する暗号化アルゴリズム(もしくは暗号の強度)が違うとうまく動かないので、統一するように注意する。

例えば、Spring Securityの設定を以下のようにしているときに

@Configuration
public class AuthenticationConfigration extends GlobalAuthenticationConfigurerAdapter {

	@Autowired
	private UserDetailsService service;

	@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder(); //アルゴリズムにBCrypt、ラウンド数10を指定
	}

	@Override
	public void init(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(service).passwordEncoder(passwordEncoder());
	}
}

デフォルトユーザーを作成するsqlは以下のようになる。
data.sql

-- デフォルトユーザを作成するSQL
INSERT INTO users(user_id,passwd) VALUES('defaultuser',crypt('defaultuser',gen_salt('bf',10)));