JAVA 심화

[JAVA] 심화 - 단방향 암호화 기법 (1)

beginner-in-coding 2024. 12. 30. 15:29

01. 단방향 암호화 알고리즘 정의

  • 한 쪽으로만 암호화 하는 방법
  • 다양한 길이의 문장을 항상 고정된 길이의 암호문으로 변환하지만, 원래 문장으로 복호화 할 수 없음


02. 단방향 암호화 특성

  • 단방향 암호화는 비밀번호 암호화, 문서 진위 여부 검증 등 다양한 목적으로 사용
  • 비밀번호를 단방향으로 사용하는 이유: 복호화 불가능
    • 해커가 암호문으로 저장된 비밀번호를 훔쳐가더라도 복호화가 불가능하므로 원래 비밀번호를 알 수 없음
  • 증명서, 문서 진위 여부로 사용할 때: 중요한 문서가 진짜인지 확인할 경우에도 사용
    • 문서의 진위를 확인해달라고 요청할 시,
    • 이 문서의 암호문(즉 해시값)을 생성하여 내가 가지고 있는 암호문과 비교
    • 두 암호문이 동일하다면 증명서가 진짜라고 판단
  • 비밀번호를 안전하게 저장하려면 양방향 암호 알고리즘을 사용해야 하는 것이 아닌가?
    • 양방향 암호 알고리즘은 복호화를 통해 원래 비밀번호를 알아낼 가능성이 존재함
    • 따라서 단방향 암호 알고리즘을 사용하는 것

03. 해시 함수(Hash Function) 정의

  • 해시 함수: 입력 값 처리 후 출력 값을 반환하는 함수, 이해하기 어려운 문장으로 나열


04. 해시 함수(Hash Function) 특징 4가지


(1) 항상 고정된 길이의 해시 값 출력

  • ex) 64개의 16진수 문자열 == 256 비트
  • 입력 값과 상관 없이 항상 고정된 길이의 해시 값을 만듦
  • 일반적으로 해시 값은 64개의 16진수 문자열로 표현
  • 각 16진수 자리는 4비트로 표현되므로 16진수로 표현된 숫자의 개수(64개)를 4로 곱하면 256 비트의 해시 값을 만들 수 있음
  • 비밀번호가 짧든 길든 해시 값의 길이가 동일하기 때문에 해시값의 길이로는 비밀번호의 길이를 유추하기 어려움

*16진수: 0~9, A~F로 구성된 16을 기수로 하는 번호 체계

(1) 항상 고정된 길이의 해시 값 출력


(2) 동일한 입력 값에 대해 항상 동일한 해시 값 출력

  • 다음과 같이 동일한 입력 값을 반복해서 넣어도 해시 함수의 결과는 변하지 않음

(2) 동일한 입력 값에 대해 항상 동일한 해시 값 출력


(3) 입력의 작은 변화에 출력이 크게 변함(눈사태 효과)

  • 입력 값이 조금이라도 변경된다면 완전히 다른 해시 값을 출력함
  • 앞서 설명한 것처럼 동일한 입력 값에는 동일한 해시 값을 출력하지만, 입력값이 조금이라도 달라진다면 출력 값도 변화가 생김
  • 입력의 작은 변화에 출력이 크게 변하기 때문에 눈사태 효과라고 함
  • 만약 해시 함수가 유사한 입력에 유사한 해시 값을 만든다면 비밀번호 암호화에 사용하지 않았을 것
  • 입력 값이 조금만 달라져도 완전히 다른 해시 값을 출력하기 때문에 해시 값을 보고 비밀번호 패턴을 유추하기 어려움

(3) 입력의 작은 변화에 출력이 크게 변함(눈사태 효과)


(4) 해시 값으로 입력 값 유추 할 수 없음 -> 입력에서 출력으로 향하는 단방향

  • 해시 값으로 원래의 입력 값을 유추 할 수 없음
  • 복잡하게 나열된 해시 값으로 원래 입력 값을 찾기는 현실적으로 불가능함
  • 입력에서 출력으로 향한느 단방향 암호 알고리즘을 사용하기 때문
  • 코딩을 할 때, 비밀번호를 해시 값으로 변환하여 저장하는 이유도 비밀번호 유출을 최소화하기 위함임
  • 여러 곳에서 회원가입을하다 보면 유사한 비밀번호가 유출된다면 다른 곳의 계정도 안전을 보장하지 못하게 됨
  • 따라서 해시 함수를 이용하면 원래 비밀 번호를 알아낼 수 없기 때문에 해시 값이 유출되더라도 다른 곳의 비밀 번호를 유지할 수 있음

(4) 해시 값으로 입력 값 유추 할 수 없음 -> 입력에서 출력으로 향하는 단방향