์ํธํ์ ์ข ๋ฅ
SHA-2(Secure Hash Algorithm 2)
- ๋ฏธ๊ตญ NSA์์ ์ค๊ณํ ์ํธํ ํด์ ํจ์.
- digest size๋ 224, 256, 384or512 bit๋ก 6๊ฐ์ ํด์ํจ์๋ก ๊ตฌ์ฑ๋์ด์ก์.
- GPU๋ฅผ ์ด์ฉํ ์ฐ์ฐ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ password ์ํธํ์ ๊ถ์ฅ๋์ง ์์
- GPU ์ฐ์ฐ์๋๊ฐ ๋น ๋ฅผ์๋ก ๊ณต๊ฒฉ์์ ํ๋์จ์ด๋ฅผ ํตํ ์คํ๋ผ์ธ brute force์ ๋ ์ทจ์ฝํ๋ค.
- ๋น ๋ฅธ ํด์๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ๋ฅผ ์งํ์ ๊ณต๊ฒฉ์๋ ์คํ๋ผ์ธ ๊ณต๊ฒฉ์ผ๋ก ์ด๋น ์์ญ์ต๊ฐ์ ํด์๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
PBKDF2(Password-Based Key Derivation Function)
pbkdf2_hmac(ํด์ํจ์(sha256..), password, salt, iteration, DLen)
- ํด์ํจ์์ ์ปจํ ์ด๋ ์ญํ ์ ํ๋ค.
- ๊ฒ์ฆ๋ ํด์ํจ์๋ง์ ์ฌ์ฉํ๋ค.
- ํด์ํจ์์ salt๋ฅผ ์ ์ฉ ํ ํด์ ํจ์์ ๋ฐ๋ณตํ์๋ฅผ ์ง์ ํ์ฌ ์ํธํํ ์ ์๋ค.
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํจ์. ISO ํ์ค์ ์ ํฉํ๋ฉฐ NIST์์ ์น์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
NIST Special Publication 800-132
Bcrypt
bcrypt.hashpw(password, bcrypt.gensalt())
- 1999๋ ์ publish๋ password-hashing function์ด๋ค.
- Blowfish ์ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ ์ํธํ ํจ์์ด๋ฉฐ ํ์ฌ๊น์ง ์ฌ์ฉ์ค์ธ ๊ฐ์ฅ ๊ฐ๋ ฅํ ํด์ ๋ฉ์ปค๋์ฆ ์ค ํ๋์ด๋ค.
- ๋ณด์์ ์ง์ฐฉํ๊ธฐ๋ก ์ ๋ช ํ OpenBSD์์ ์ฌ์ฉํ๊ณ ์๋ค.
- .NET ๋ฐ Java๋ฅผ ํฌํจํ ๋ง์ ํ๋ซํผ,์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ฐ๋ณตํ์๋ฅผ ๋๋ ค ์ฐ์ฐ์๋๋ฅผ ๋ฆ์ถ ์ ์์ผ๋ฏ๋ก ์ฐ์ฐ ๋ฅ๋ ฅ์ด ์ฆ๊ฐํ๋๋ผ๋ brute-forece ๊ณต๊ฒฉ์ ๋๋นํ ์ ์๋ค.
SHA๋ฅผ ์ํธํด์ฑ์ ์ฌ์ฉํ๋ ์ํธํ ํจ์๋ค์ GPU๋ฅผ ์ด์ฉํ ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ฉฐ(SHA family๋ ์ฐ์ฐ์๋๊ฐ ๋งค์ฐ๋น ๋ฅด๊ธฐ ๋๋ฌธ) ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ์ง ์๋ ์ ์ ๋ฌธ์ ๋ก ์ง์ ํ๊ณ ์์ต๋๋ค.
SHA๊ฐ ๋ณด์์ ๊ฒฐํจ์ด ์์ด์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด ์๋๋ผ, SHA๋ ์ผ๋ฐ์ ์ผ๋ก GPU์ฐ์ฐ์ ์ ๋ฆฌํ 32๋นํธ ๋ ผ๋ฆฌ ๋ฐ ์ฐ์ ์ฐ์ฐ๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๊ณต๊ฒฉ์๊ฐ ๋น ๋ฅธ์ฐ์ฐ์ผ๋ก ๊ณต๊ฒฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Bcrypt ์ค๊ณ์๋ค์ ์ด๋ฐ ๋ฌธ์ ๋ก SHA๊ฐ ์๋ Blowfish๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ์์ต๋๋ค.
Maven Dependency
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
์ํ ์์ค
import org.springframework.security.crypto.bcrypt.BCrypt;
public class BCryptTest {
public static void main(String[] args) {
String password = "์ํธํํ ๋ฌธ์์ด";
// ๋๋น์ ์ ์ฅํ ๋น๋ฐ๋ฒํธ ์ํธํ
String encrypted = BCrypt.hashpw(password, BCrypt.gensalt());
System.out.println("encrypted : " + encrypted);
// ๋ก๊ทธ์ธ์ ๋๋น์ ์ ์ฅ๋ ์ํธํ๋ ๋ฌธ์์ด๊ณผ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋น๋ฐ๋ฒํธ๋ก checkpw ๊ฒ์ฆ
System.out.println(BCrypt.checkpw(password, encrypted)); // true
System.out.println(BCrypt.checkpw(password + "1", encrypted)); // false
}
}
์ Password hashing์ Bcrypt ๊ฐ ์ถ์ฒ๋์ด์ง๊น?
์ ํํ๋ bcrypt๊ฐ ์ ๋ต์ ์๋๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ณต๊ฒฉ์๋ GPU๋ฅผ ์ด์ฉํ์ฌ ๋น ๋ฅธ ์ฐ์ฐ์๋๋ก ์ํธํ ๊ณต๊ฒฉ ์๋๋ฅผ ํฉ๋๋ค. ์ด๋ค ์ํธํ ํจ์(sha-2, bcrypt, pbkdf2, scrypt, ..)๋ฅผ ์ฐ๋ ๊ฐ๋ ฅํ์ง๋ง, ์ถฉ๋ถํ ์
velog.io
'Languages | Frameworks > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java) List์ ArrayList์ ์ฐจ์ด? (0) | 2022.11.08 |
---|---|
JPA, JPQL (0) | 2022.09.27 |
๊ฒ์ํ ๊ธ์ด ์ค๊ฐ์ ์ญ์ ์ > ๋ฒํธ ์ด๊ธฐํํ ์ธ๋ฑ์ฑ ํ๋ ๋ฐฉ๋ฒ (0) | 2022.07.13 |
[Java] ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค (0) | 2022.05.30 |
Optional์ด๋? (0) | 2021.09.17 |