Web/보안
[Web/보안] - 암호화 기법(HASH와 SALT)
poopooreum
2024. 10. 23. 12:13
반응형
오늘은 암호화 기법에 대해서 포스팅 해보도록 하겠습니다.
플젝을 진행하면서 비밀번호를 어떻게 저장해야할까에 대해서 공부하던 중 salt라는 것에 대해서 알게 되었고
조금 더 찾아보니 도움이 될 만한 내용들이 있는 것 같아서 해시와 솔트라는 주제로 업로드를 해보겠습니다.
✏️ 암호화
- 단방향 암호화 : 암호화만 가능하고 복호화가 불가능
- 양방향 암호화 : 암호화한 다음 복호화도 가능
✏️ 해시
- 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수(주로 SHA 방식으로 이용)
- SHA(Seucre Hash Algorithm)
- 서로 관련된 암호학적 해시 함수들의 모음
- SHA-256, SHA-512 등등 ⇒ 주로 SHA-256방식을 사용
✏️ SHA-256
- 변환하고자 하는 문자열을 바이너리 형태로 변환
- 바이너리 데이터는 512 비트의 블락들로 나뉘고, 블락이 512 보다 작다면 패딩을 통해 사이즈를 늘림, 블락이 512보다 크다면 512 비트에서 자름
- 512비트로 나눈 블락들을 다시 32비트로 자른다
- 압축 함수를 64회 반복
- 각 블락별로 해시값을 구해서, 첫 번째 블락의 해시 결과가 두 번째 블락의 입력값으로 사용되며 두 번째 블락의 해시 결과는 첫 번째 블락의 해시 결과와 두 번째 블락 데이터와 결합해서 구해짐
- 최종적으로 256비트의 해시값이 생성
- 이렇게 만들어진 해시 함수를 다이제스트라고 부르며 복호화가 불가능하여 비밀번호를 저장할 때 사용
✏️ 레인보우 테이블
- 해커들이 여러 값들을 대입해보면서 얻은 다이제스트들을 모아둔 테이블
- 자판 위치가 서로 가깝게 연관되어 있다면 복호화가 가능하다고 함
- 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를 이용해 구현했다고 함.
반응형