PasswordEncoder

μ €λΆ€λ‹· NoOpPasswordEncoder

  • μ•”ν˜Έλ₯Ό μΈμ½”λ”©ν•˜μ§€ μ•ŠλŠ”λ‹€

StandardPasswordEncoder

  • SHA-256을 μ΄μš©ν•΄ μ•”ν˜Έλ₯Ό ν•΄μ‹œν•œλ‹€

  • 이제 ꡬ식이닀.

  • SHA-256은 μž…λ ₯ 데이터λ₯Ό 256λΉ„νŠΈ(32λ°”μ΄νŠΈ)의 κ³ μ • 길이 ν•΄μ‹œ κ°’μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 단방ν–₯ ν•΄μ‹œ ν•¨μˆ˜μž…λ‹ˆλ‹€

  • λΉ„λ°€λ²ˆν˜Έ μ €μž₯μ—λŠ” μ†”νŠΈ(salt)와 좔가적인 λ³΄μ•ˆ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μΈ Pbkdf2PasswordEncoder, BCryptPasswordEncoder, SCryptPasswordEncoder와 같은 λΉ„λ°€λ²ˆν˜Έ 인코딩 μ•Œκ³ λ¦¬μ¦˜μ΄ ꢌμž₯λ©λ‹ˆλ‹€.

    • μ†”νŠΈ(Salt)λŠ” λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹±μ—μ„œ μ‚¬μš©λ˜λŠ” λ³΄μ•ˆμ μΈ μš”μ†Œλ‘œ, 각각의 λΉ„λ°€λ²ˆν˜Έμ— λŒ€ν•΄ κ³ μœ ν•œ μΆ”κ°€ λ°μ΄ν„°μž…λ‹ˆλ‹€. μ†”νŠΈλŠ” ν•΄μ‹œ ν•¨μˆ˜μ— μž…λ ₯되기 전에 λΉ„λ°€λ²ˆν˜Έμ™€ κ²°ν•©λ˜μ–΄ ν•΄μ‹±λ©λ‹ˆλ‹€

νŠΉμ§•

  1. 일방ν–₯μ„±: ν•΄μ‹œ ν•¨μˆ˜λŠ” μž…λ ₯ 값을 ν•΄μ‹œ κ°’μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •μ—μ„œ 단방ν–₯으둜 λ™μž‘ν•©λ‹ˆλ‹€. 즉, ν•΄μ‹œ κ°’μ—μ„œ μž…λ ₯ 값을 μ—­μ‚°ν•˜μ—¬ λ³΅κ΅¬ν•˜λŠ” 것은 맀우 μ–΄λ ΅κ±°λ‚˜ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

  2. κ³ μ • 길이 좜λ ₯: SHA-256은 항상 256λΉ„νŠΈ(32λ°”μ΄νŠΈ)의 κ³ μ • 길이 ν•΄μ‹œ 값을 μƒμ„±ν•©λ‹ˆλ‹€. μž…λ ₯ λ°μ΄ν„°μ˜ 크기에 상관없이 항상 λ™μΌν•œ 길이의 좜λ ₯을 μƒμ„±ν•©λ‹ˆλ‹€.

  3. κ³ μœ μ„±: SHA-256은 μ„œλ‘œ λ‹€λ₯Έ μž…λ ₯에 λŒ€ν•΄ 거의 ν™•λ₯ μ μœΌλ‘œ μœ μΌν•œ ν•΄μ‹œ 값을 μƒμ„±ν•©λ‹ˆλ‹€. 즉, 두 개의 λ‹€λ₯Έ μž…λ ₯이 있으면 ν•΄μ‹œ 값도 맀우 λ‹€λ₯Έ 값이 될 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.

  4. μ €ν•­μ„±: SHA-256은 좩돌 저항성이 κ°•ν™”λœ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. μΆ©λŒμ€ 두 개의 μ„œλ‘œ λ‹€λ₯Έ μž…λ ₯이 λ™μΌν•œ ν•΄μ‹œ 값을 μƒμ„±ν•˜λŠ” 상황을 μ˜λ―Έν•©λ‹ˆλ‹€. SHA-256은 μΆ©λŒμ„ 맀우 μ–΄λ ΅κ²Œ λ§Œλ“€μ–΄, μž…λ ₯ 값을 μ•½κ°„λ§Œ 변경해도 μ™„μ „νžˆ λ‹€λ₯Έ ν•΄μ‹œ 값을 μƒμ„±ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Pbkdf2PasswordEncoder

  • PBKDF2λŠ” Password-Based Key Derivation Function 2의 μ•½μžμž…λ‹ˆλ‹€.

  • μ΄λŠ” SHA-1μ΄λ‚˜ SHA-256κ³Ό 같은 μ•”ν˜Έν™” ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ 번 μ μš©ν•˜μ—¬ μ•ˆμ „ν•œ λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹œλ₯Ό μƒμ„±ν•˜λŠ” 데 널리 μ‚¬μš©λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

  • PBKDF2λŠ” 계산 λΉ„μš©μ„ κ²°μ •ν•˜λŠ” 반볡 횟수λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. 반볡 횟수λ₯Ό 늘릴수둝 무차별 λŒ€μž… 곡격에 λŒ€ν•΄ 더 κ°•λ ₯ν•΄μ§€μ§€λ§Œ, λΉ„λ°€λ²ˆν˜Έ 해싱에 ν•„μš”ν•œ 처리 μ‹œκ°„λ„ μ¦κ°€ν•©λ‹ˆλ‹€.

  • PBKDF2μ—λŠ” λ‚΄μž₯된 μ†”νŠΈ 생성 κΈ°λŠ₯이 μ—†μŠ΅λ‹ˆλ‹€. μ†”νŠΈλŠ” 각 λΉ„λ°€λ²ˆν˜Έλ§ˆλ‹€ λ³„λ„λ‘œ μƒμ„±ν•˜κ³  μ €μž₯ν•΄μ•Ό λ³΄μ•ˆμ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

  • μ‹ λ’°μ„±κ³Ό μ•ˆμ „μ„±μ΄ 높은 λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€.

  • PBKDF2λŠ” Password-Based Key Derivation Function 2의 μ•½μžμž…λ‹ˆλ‹€.

  • μ΄λŠ” SHA-1μ΄λ‚˜ SHA-256κ³Ό 같은 μ•”ν˜Έν™” ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ 번 μ μš©ν•˜μ—¬ μ•ˆμ „ν•œ λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹œλ₯Ό μƒμ„±ν•˜λŠ” 데 널리 μ‚¬μš©λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

  • PBKDF2λŠ” 계산 λΉ„μš©μ„ κ²°μ •ν•˜λŠ” 반볡 횟수λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. 반볡 횟수λ₯Ό 늘릴수둝 무차별 λŒ€μž… 곡격에 λŒ€ν•΄ 더 κ°•λ ₯ν•΄μ§€μ§€λ§Œ, λΉ„λ°€λ²ˆν˜Έ 해싱에 ν•„μš”ν•œ 처리 μ‹œκ°„λ„ μ¦κ°€ν•©λ‹ˆλ‹€.

  • PBKDF2μ—λŠ” λ‚΄μž₯된 μ†”νŠΈ 생성 κΈ°λŠ₯이 μ—†μŠ΅λ‹ˆλ‹€. μ†”νŠΈλŠ” 각 λΉ„λ°€λ²ˆν˜Έλ§ˆλ‹€ λ³„λ„λ‘œ μƒμ„±ν•˜κ³  μ €μž₯ν•΄μ•Ό λ³΄μ•ˆμ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

  • μ‹ λ’°μ„±κ³Ό μ•ˆμ „μ„±μ΄ 높은 λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€.

BCryptPasswordEncoder

  • BCryptλŠ” 또 λ‹€λ₯Έ 널리 μ‚¬μš©λ˜λŠ” λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

  • λ‚΄μž₯된 μ†”νŠΈ 생성 κΈ°λŠ₯을 ν¬ν•¨ν•˜λ©°, μƒμ„±λœ ν•΄μ‹œ λ‚΄μ—μ„œ μ†”νŠΈλ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • BCryptλŠ” Blowfish μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

SCryptPasswordEncoder

  • SCryptλŠ” λ©”λͺ¨λ¦¬ ν•˜λ“œ ν•¨μˆ˜λ‘œ μ•Œλ €μ§„ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

  • λ©”λͺ¨λ¦¬ ν•˜λ“œ ν•¨μˆ˜λŠ” μ•”ν˜Έν™” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό ν•„μš”λ‘œ ν•˜λ―€λ‘œ, κ³΅κ²©μžκ°€ 효율적인 ν•˜λ“œμ›¨μ–΄λ₯Ό μ‚¬μš©ν•΄ 곡격을 μ‹œλ„ν•˜λŠ” 것을 μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€.

  • SCryptλŠ” λ‚΄μž₯된 μ†”νŠΈ 생성 κΈ°λŠ₯을 ν¬ν•¨ν•˜κ³ , μ†”νŠΈλ₯Ό μƒμ„±λœ ν•΄μ‹œ 내에 μžλ™μœΌλ‘œ μ €μž₯ν•©λ‹ˆλ‹€.

  • PBKDF2와 λΉ„κ΅ν•˜μ—¬ 더 큰 λ©”λͺ¨λ¦¬ μš”κ΅¬μ‚¬ν•­κ³Ό 더 높은 계산 λΉ„μš©μ΄ ν•„μš”ν•˜λ©°, λ³΄μ•ˆμ„±μ΄ 높은 λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€.

λ™μž‘ 방식

μ ‘λ‘μ‚¬λ‘œ νŒλ‹¨

SSCM ν•„μˆ˜ κΈ°λŠ₯

μŠ€ν”„λ§ μ‹œνλ¦¬ν„° μ•”ν˜Έν™” λͺ¨λ“ˆ SSCM (Single Sign-On(SSO) Client Manager)

  • ν‚€ 생성기

    • ν•΄μ„± 및 μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μ„ μœ„ν•œ ν‚€λ₯Ό μƒμ„±ν•˜λŠ” 객체

BytesKeyGenerater keyGenerator = KeyGenerator.secureRandom(16);
  • μ•”ν˜ΈκΈ°

    • 데이터λ₯Ό μ•”ν˜Έν™” 및 λ³΅ν˜Έν™”ν•˜λŠ” 객체

String salt = KeyGenerator.string().generateKey();
String password = "secret";
String valueToEncrypt = "Hello";

BytesEncrptor e = Encryptors.standard(password, salt);
byte[] encrypted = e.encrypt(valueToEncrypt.getBytes());
byte[] decrypted = e.decrypt(encrypted);

Last updated

Was this helpful?