spring-security-cryptoのSCryptPasswordEncoderを使ってパスワードを暗号化する

2023/08/21に公開

SCryptPasswordEncoderを使ってパスワードを暗号化する

依存性追加

build.gradle
// crypto
implementation 'org.springframework.security:spring-security-crypto'

java.lang.NoClassDefFoundError: org/bouncycastle/crypto/generators/SCrypt

spring-security-cryptoのみimportしてSCryptPasswordEncoderを使おうとするとエラーが出る

java.lang.NoClassDefFoundError: org/bouncycastle/crypto/generators/SCrypt
// crypto
implementation 'org.springframework.security:spring-security-crypto'
implementation 'org.bouncycastle:bcprov-jdk18on:1.77' // <- 追記

SCryptPasswordEncoderを利用した簡単なコード

AuthService.java
public void signUp(Signup signup) {
	if (userRepository.findByEmail(signup.getEmail()).isPresent()) {
	    throw new EmailAlreadyExistsException();
	}

	SCryptPasswordEncoder encoder = new SCryptPasswordEncoder(
		2, 8, 1, 32, 64
	);
	String encodedPassword = encoder.encode(signup.getPassword());

	User user = User.builder()
		.name(signup.getName())
		.email(signup.getEmail())
		.password(encodedPassword)
		.build();

	userRepository.save(user);
}

SCryptPasswordEncoderのParameter

  • cpuCost – 1以上の2の倍数、デフォルトは16
  • memoryCost – デフォルト8
  • parallelization – デフォルト1、現在は具現化されてない
  • keyLength – デフォルト32
  • saltLength – デフォルト16.

Discussion