πŸ’»
Albert's Til
GitHub
  • 맀일맀일 μ‘°κΈˆμ”© μ„±μž₯ν•˜κΈ°
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • 였λ₯˜ μ½”λ“œ
      • ORM 도ꡬ
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • λ””λ―Έν„° 법칙
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT 토큰 μ‚¬μš©ν•œ 인가
        • OAuth 2 Login
        • OAuth 2 인증
        • 인가
        • 인증
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud μœ ν˜•
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • 무쀑단 배포
        • μ—”μ§„μ—‘μŠ€(Nginx)
      • μ½”λ“œ μžλ™ 배포
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) ν‚€
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1μ£Όμ°¨ 회고
      • Spring Boot Project 2μ£Όμ°¨ 회고
      • Spirng Boot Project 3μ£Όμ°¨ 회고
      • Spring Boot Project 4μ£Όμ°¨ 회고
    • Foody Moody ν”„λ‘œμ νŠΈ
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • 기술 μŠ€νƒ 적용 이유
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • StandardPasswordEncoder
  • νŠΉμ§•
  • Pbkdf2PasswordEncoder
  • BCryptPasswordEncoder
  • SCryptPasswordEncoder
  • λ™μž‘ 방식
  • SSCM ν•„μˆ˜ κΈ°λŠ₯
  • μŠ€ν”„λ§ μ‹œνλ¦¬ν„° μ•”ν˜Έν™” λͺ¨λ“ˆ SSCM (Single Sign-On(SSO) Client Manager)

Was this helpful?

  1. 맀일맀일 μ‘°κΈˆμ”© μ„±μž₯ν•˜κΈ°
  2. Spring
  3. Spring Security

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 2 years ago

Was this helpful?

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