🌻 JAVA/정리정리정리

해시(Hash)?솔트(Salt)? 패스워드 암호화 대해서

2022. 2. 21. 23:53
목차
  1. 해시를 통한 암호화
  2. 하지만, 동일한 다이제스트..
  3. Salt란?
  4. Salt + 여러번 해싱하기
  5. REFERENCES
반응형

해시를 통한 암호화

 

Hash(해시)란? 단방향 암호화 기법으로 해시 함수를 통해 암호화 된 문자열을 만드는 것을 의미합니다.
ex) SHA-256, Bcrypt ..

사용자의 패스워드는 평문으로 저장하는 것은 위험한 일입니다. 그렇기 때문에 보통 해시 함수를 통해 암호화를 진행하게 되는데, 이도 그렇게 안전한 것은 아닙니다. 공격자가 모든 평문을 해시화하여 대조를 하여 패스워드를 알아낼 수도 있다는 뜻입니다.

  • 해커는 무한대로 공격을 한다면 어떤 암호화를 해도 패스워드를 알아낼 수 있을 것입니다.
  • 하지만 해커들이 무한대로 공격을 할 수 있을까요? X
    • 해독할 때 조금이라도 더 암호화를 해서 해커들에게 단 몇초라도 지연시킬 수 있다면 해커들에게는 치명적인 시간이 될 수 있습니다.
더보기

암호를 해독하는데 걸리는 시간

조합 가능한 모든 문자열을 대입하기 때문에 아무리 컴퓨터가 빠르다고 하더라도 시간이 매우 많이 걸린다. 당장 영문 소문자 + 숫자 조합만 쳐도 nn자리의 암호를 뚫는 데에는 O(36^n)의 시간이 걸린다. 즉, 10글자만 되어도 3610 = 3,656,158,440,062,976 가지가 된다. 이 정도면 쉬운 암호 알고리즘이라 해도 초당 1억 번 계산 기준 대충 14개월 걸리는 수준이다. 물론 암호가 더 복잡하거나 길이가 더 길어지면 수백~수천 년은 기본으로 기다려야 한다.

REFERENCE : https://namu.wiki/w/%EB%B8%8C%EB%A3%A8%ED%8A%B8%20%ED%8F%AC%EC%8A%A4#toc

 

Digest(다이제스트)란? 해싱을 통해 얻은 암호화된 데이터를 의미합니다.

 

하지만, 동일한 다이제스트..

같은 문자열을 해싱을 하면 동일한 다이제스트가 나오게 됩니다.
그렇기 때문에 그동안 구해놓은 다이제스트를 저장해둔 레인보우 테이블이라는 곳이 있습니다.
해커들은 이 곳을 참조하여 공격을 시도할 수 있습니다.

어떻게 하면 해커들이 해독하기 힘들게 할 수 있을까요?

 

두 가지 방법이 있습니다.

  • 해싱을 여러번 반복하는 방법
  • Salt라는 임의의 값을 붙여서 해싱하는 방법

(물론 둘 다 사용하면 더 좋습니다.)

 

Salt란?

Salt? 소금? 사용자의 암호를 그대로 해시를 한다면 브루트 포스 공격을 통해서 패스워드가 쉽게 노출될 가능성이 있습니다.

소금을 친다라는 뜻으로, 임의의 문자를 패스워드 뒤에 붙여서 해싱을 하면 암호화된 문자열을 복호화하는데 성공한다해도 Salt값이 섞여있기 때문에 기존의 패스워드를 찾기 어려울 것입니다.

 

Salt는 해싱을 하기전에 원문에 임의의 문자열을 붙이는 것을 의미합니다.

 

Salt + 여러번 해싱하기

해싱을 몇번을 반복했는지도 해커들이 해독하는데 조금의 시간을 지연시킬 수 있습니다.

패스워드에 Salt를 붙여 해싱을 N번을 반복하면 더욱 더 알아내기 어려운 다이제스트를 얻을 수 있습니다.

 

해싱을 여러번 하는 것을 Key Stretching(키 스트레칭)이라고 합니다.

 

 

REFERENCES

  • Clap Yeon님의 Medium
  • st-lab님의 blog
  • dev_eun님의 blog

감사합니다.

반응형
저작자표시 (새창열림)
  1. 해시를 통한 암호화
  2. 하지만, 동일한 다이제스트..
  3. Salt란?
  4. Salt + 여러번 해싱하기
  5. REFERENCES
'🌻 JAVA/정리정리정리' 카테고리의 다른 글
  • Jackson ObjectMapper 비직렬화 과정
  • [JAVA] System.getProperties로 프로퍼티 값 받기
  • [JAVA] properties 값 읽어오기
  • intellij에서 Java 프로젝트 jar 파일 생성하기
iseunghan
iseunghan
꾸준하게 열심히..
iseunghan
iseunghan

공지사항

  • 어제보다 나은 오늘이 되기 위해 🔥
  • 분류 전체보기 (262)
    • 💐 Spring (14)
      • 개념 및 이해 (2)
      • Spring 핵심 기술 (24)
      • Spring REST API (8)
      • Spring MVC, DB 접근 기술 (7)
      • Spring Security (23)
      • Spring in Action (1)
    • 🌻 JAVA (84)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
      • 알고리즘, 자료구조 (13)
      • 디자인 패턴 (7)
      • 정리정리정리 (43)
      • JUnit (1)
    • 🔖 Snippets (3)
      • Javascript (3)
    • ⚙️ Devops (22)
      • ⛏ Git (11)
      • 🐳 Docker (6)
      • 🐧 Linux (3)
      • 🌈 Jenkins (1)
      • 📬 Kafka (1)
    • 💬 ETC.. (4)
      • 💻 macOS (2)
    • 🌧️ ORM (2)
      • JPA (2)
    • 🐍 Python (3)
    • 📚 Databases (15)
      • 오라클로 배우는 데이터베이스 개론과 실습(2판) (3)
      • RealMySQL 8.0 (8)
    • 🔥 Computer Science (5)
      • 📡 네트워크 (5)
    • 🏷️ 협업 (1)
    • 📜 코딩테스트 (38)
      • BAEKJOON\수학 1, 수학 2 (8)
      • BAEKJOON\재귀 (5)
      • BAEKJOON\브루트 포스 (3)
      • BAEKJOON\정렬 (1)
      • BAEKJOON\백트래킹 (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\이분탐색 (1)
      • BAEKJOON\다이나믹 프로그래밍 (9)
      • BAEKJOON\그리디 알고리즘 (0)
    • ✨ ISEUNGHAN (1)

인기 글

최근 글

전체
오늘
어제
반응형
hELLO · Designed By 정상우.
iseunghan
해시(Hash)?솔트(Salt)? 패스워드 암호화 대해서
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.