암호 처리

PasswordEncoder

passwordEncoder는 비밀번호를 암호화하는데 사용된다. 인증 프로세스에서 암호가 유효한지를 확인한다.

public interface PasswordEncoder {
    fun encode(rawPassword: CharSequence): String
    fun matches(rawPassword: CharSequence, encodedPassword: String): Boolean
}

matches() : 암호화된 비밀번호와 사용자가 제공한 비밀번호를 비교한다. encode() : 사용자가 제공한 비밀번호를 암호화한다.

기본 제공되는 PasswordEncoder

NoOpPasswordEncoder : 비밀번호를 암호화하지 않는다. (테스트용)

StandardPasswordEncoder

SHA-256 해시 함수를 사용하여 비밀번호를 암호화한다.

@Bean
fun passwordEncoder(): PasswordEncoder = StandardPasswordEncoder("secret key")

Pbkdf2PasswordEncoder

PBKDF2 해시 함수를 사용하여 비밀번호를 암호화한다.

@Bean
fun passwordEncoder(): PasswordEncoder = Pbkdf2PasswordEncoder("secret key", 185000, 256) 

두번째와 세번째 인자는 각각 반복 횟수와 해시 길이를 나타낸다.

BCryptPasswordEncoder

BCrypt 해시 함수를 사용하여 비밀번호를 암호화한다.

@Bean
fun passwordEncoder(): PasswordEncoder = BCryptPasswordEncoder(4) // 4 ~ 31 사이의 값으로 강도를 설정한다.

SCryptPasswordEncoder

SCrypt 해시 함수를 사용하여 비밀번호를 암호화한다.

@Bean
fun passwordEncoder(): PasswordEncoder = SCryptPasswordEncoder(16384, 8, 1, 32, 64)

각각의 인자는 다음과 같다.

  • cpuCost : CPU 비용

  • memoryCost : 메모리 비용

  • parallelization : 병렬화

  • keyLength : 키 길이

  • saltLength : 솔트 길이

DelegatingPasswordEncoder

DelegatingPasswordEncoder는 여러 암호화 알고리즘을 지원한다.

@Bean
fun passwordEncoder(): PasswordEncoder = DelegatingPasswordEncoder(
    "bcrypt",
    mapOf(
        "bcrypt" to BCryptPasswordEncoder(4),
        "scrypt" to SCryptPasswordEncoder(16384, 8, 1, 32, 64),
        "pbkdf2" to Pbkdf2PasswordEncoder("secret key", 185000, 256),
        "sha256" to StandardPasswordEncoder("secret key")
    )
)

접두사를 사용하여 암호화 알고리즘을 지정할 수 있다.

// EXAMPLE
{bcrypt}$2a$10$zj4J6T5Zzv6ZzR9ZzZzZzO // BCrypt
{pbkdf2}5d923b44d9d5f6 ... // PBKDF2
...

키 생성기

특정한 종류의 키를 생성하는데 사용되는 객체로써, 암호화나 해싱 알고리즘에 사용된다

StringKeyGenerator

public interface StringKeyGenerator {
    fun generateKey(): String
}

///
val keyGenerator: StringKeyGenerator = KeyGenerator.string()
val salt: String = keyGenerator.generateKey()

위는 8byte의 키를 생성하고 16진수 문자열로 인코딩한다

BytesKeyGenerator

public interface BytesKeyGenerator {
    fun generateKey(): ByteArray
    fun getKeyLength(): Int
}
///
val keyGenerator: BytesKeyGenerator = KeyGenerators.secureRandom()
val salt: ByteArray = keyGenerator.generateKey()
val keyLength: Int = keyGenerator.getKeyLength()

위 코드는 8byte의 키를 생성한다. 키 길이를 지정하려면 secureRandom() 대신 secureRandom(16)과 같이 사용한다.

암&복호화

시스템 요소를 암호화 하고 복호화 하는데 사용된다.

TextEncryptor

public interface TextEncryptor {
    fun encrypt(text: String): String
    fun decrypt(encryptedText: String): String
}
///
val salt: String = KeyGenerators.string().generateKey()
val textEncryptor: TextEncryptor = Encryptors.text("password", salt)
val encryptedText: String = textEncryptor.encrypt("Hello World!")
val decryptedText: String = textEncryptor.decrypt(encryptedText)

데이터를 문자열로 암호화하고 복호화한다.

BytesEncryptor

public interface BytesEncryptor {
    fun encrypt(input: ByteArray): ByteArray
    fun decrypt(encrypted: ByteArray): ByteArray
}
///
val salt: String = KeyGenerators.string().generateKey()
val bytesEncryptor: BytesEncryptor = Encryptors.standard("password", salt)
val encryptedBytes: ByteArray = bytesEncryptor.encrypt("Hello World!".toByteArray())
val decryptedBytes: ByteArray = bytesEncryptor.decrypt(encryptedBytes)

데이터를 바이트 배열로 암호화하고 복호화한다.

더 강력한 암호화를 위해서는 Encryptors.stronger(password, salt)를 사용한다.

Last updated