Web/보안

[Web/보안] - 암호화 기법(HASH와 SALT)

poopooreum 2024. 10. 23. 12:13
반응형

오늘은 암호화 기법에 대해서 포스팅 해보도록 하겠습니다.

플젝을 진행하면서 비밀번호를 어떻게 저장해야할까에 대해서 공부하던 중 salt라는 것에 대해서 알게 되었고

조금 더 찾아보니 도움이 될 만한 내용들이 있는 것 같아서 해시와 솔트라는 주제로 업로드를 해보겠습니다.

 


✏️  암호화

  • 단방향 암호화 : 암호화만 가능하고 복호화가 불가능
  • 양방향 암호화 : 암호화한 다음 복호화도 가능

✏️  해시

  • 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수(주로 SHA 방식으로 이용)
  • SHA(Seucre Hash Algorithm)
    • 서로 관련된 암호학적 해시 함수들의 모음
    • SHA-256, SHA-512 등등 ⇒ 주로 SHA-256방식을 사용

✏️  SHA-256

  1. 변환하고자 하는 문자열을 바이너리 형태로 변환
  2. 바이너리 데이터는 512 비트의 블락들로 나뉘고, 블락이 512 보다 작다면 패딩을 통해 사이즈를 늘림, 블락이 512보다 크다면 512 비트에서 자름
  3. 512비트로 나눈 블락들을 다시 32비트로 자른다
  4. 압축 함수를 64회 반복
  5. 각 블락별로 해시값을 구해서, 첫 번째 블락의 해시 결과가 두 번째 블락의 입력값으로 사용되며 두 번째 블락의 해시 결과는 첫 번째 블락의 해시 결과와 두 번째 블락 데이터와 결합해서 구해짐
  6. 최종적으로 256비트의 해시값이 생성
  7. 이렇게 만들어진 해시 함수를 다이제스트라고 부르며 복호화가 불가능하여 비밀번호를 저장할 때 사용

✏️  레인보우 테이블

  • 해커들이 여러 값들을 대입해보면서 얻은 다이제스트들을 모아둔 테이블
  • 자판 위치가 서로 가깝게 연관되어 있다면 복호화가 가능하다고 함
  • https://crackstation.net/
  • password를 sha-256방식으로 해싱한 값 ⇒ 5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8

 

  • 이렇게 단순한 비번이 아니면 레인보우 테이블에 등록될 가능성은 낮고, 무차별적으로 대입하여 정답을 찾아내기엔 시간적으로 불가능에 가깝긴 하지만, 가능성은 존재하기 때문에 조금 더 보완된 방법이 있다

✏️  보완 방법1 - 키 스트래칭(Key Stretching)

  • 해싱을 여러 번 수행하는 것
  • 한 번만 수행하는 것에 비해 반복횟수를 알아내야 한다는 제약조건이 추가되고, 알아냈더라도 평문으로 변환하는 고정이 오래걸려 일반 해싱보다는 안전하지만 같은 암호에 대해 같은 해시값을 반환한다는 근본적인 문제는 해결할 수 없다
  • 위에서 password라는 데이터를 암호화 한 값 5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8를 →이런 식으로 해싱한 값을 또 해싱을 해서 n번을 진행한다
  • https://www.convertstring.com/ko/Hash/SHA256  - 문자열 해싱 사이트

 

  • C9D3DA531D5F49F7570AE4A5B3C2633AED75A0E55A7803B0CB1D4FB86EA4734E
  • 위의 값을 다시 레인보우 사이트에서 검색해보면 이번엔 값을 찾지 못한다


✏️  보완 방법2 - 솔트(salt)

  • 비밀번호 뒤에 임의의 문자열을 덧붙여서 해싱하는 방식
  • 솔트값을 유저에 따라서 다르게 설정하면 한 명의 비밀번호가 유출되어도 다른 사람의 비밀번호는 안전함
  • 솔트는 절대로 재사용하면 안 된다 ⇒ 유저마다 랜덤하게 생성해서 붙이면 될 듯
  • 예를 들면 password에 poreum을 붙여서 해싱하는 것


✏️ BCRYPT

  • 브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호에 기반을 둔 암호화 해시 함수다. Niels Provos 와 David Mazières가 설계했다. Bcrypt는 **레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용**한 대표적인 예다.
  • 구조
    • 2b : 해시 알고리즘 식별자
    • 12 : Cost Factor로 Key Stretching의 수 (2의 12승번)
    • 76taFAFPE9ydE0ZsuWkIZe : 16Byte 크기의 Salt, Base64로 인코딩된 22개의 문자
    • xWVjLBbTTHWc509/OLI5nM9d5r3fkRG : 24Byte의 해시 값, Base64로 인코딩된 31개의 문자

  •  검증
    • Bcrypt는 단방향 해시 알고리즘이다. 따라서 복호화가 불가능하다. Bcrypt의 검증은 암호화된 값이 가지고 있는 알고리즘, Cost Factor, Salt를 이용한다.

기타

  • SHA 종류의 암호화는 GPU 연산에 유리한 32비트 논리 및 연산만 사용하기 때문에 GPU 연산을 이용한 공격에 취약하다고 한다. 그래서 Bcrypt 설계자는 Blowfish를 이용해 구현했다고 함.

 

반응형