[Security] 암호화 알고리즘 - 단방향 암호화, Hash

암호화 관련 포스트

단방향 암호화 (One-Way Encryption)

  • 평문을 암호문으로 바꾸는 암호화는 가능 하지만,
    암호문을 평문으로 바꾸는 복호화는 불가능
    암호화만 가능하기때문에 단방향 암호화 라 한다.
  • 주로 암호화 해시 함수 를 이용한 Hash 암호화 방식을 사용한다.

해시 함수 (Hash Function)

  • 단방향 암호화는 해시 함수를 이용한 Hash 방식을 사용하기 때문에 잠깐 해시함수를 간략하게 알아보고 가자.

이미지

정의

  • 임의의 길이의 데이터를 고정된 길이의 데이터로 반환 시켜주는 함수이다.
  • 입력값의 길이가 달라도 출력값은 언제나 고정된 길이로 반환한다.
  • 동일한 값이 입력되면 언제나 동일한 출력값을 보장한다.
  • 해시함수는 암호학적 해시 함수와 비암호학적 해시함수로 구분된다.

주된용도

  • 1) 해시 테이블 자료구조에 사용되어, 빠른 데이터 검색을 위해 사용한다.
    • 큰 파일에서 중복되는 레코드를 찾을 수 있기 때문에 데이터베이스 검색이나 테이블 검색의 속도를 가속할 수 있다.
  • 2) 암호학 에서 사용된다.
    • 해시 값으로 변환된 데이터만을 알아서는 기본 데이터를 알수가 없기때문에 암호학에서 사용된다.
  • 3) 데이터의 무결성을 확인해 주는데 사용된다.
    • 동일한 값이 입력되면 언제나 동일한 결과값을 출력하기 때문에 중간개입자로 부터 데이터 변조를 확인하는데 사용할수있다.

암호학 해시 함수가 가져야 하는 특성 과 효과들

역상 저항성

  • 제 1 역상공격에 저항성이 있어야 한다.
  • 해시 된 값이 주어져 있을때 계산을 하여 입력된 값을 계산하기가 어려워야 한다.

제2 역상 저항성

  • 제2 역상공격에 저항성이 있어야한다.
  • 원본 데이터와 해시 된 값이 주어졌을떄 똑같은 해시값을 반환하는 다른 데이터를 찾아내거나 계산이 불가능해야한다.

충돌 저항성

  • 해시 충돌에 대해서 저항성이 있어야한다.
  • 데이터 A와 데이터 B가 같은 해시값이 나오면 안된다.
  • 자료구조나 알고리즘의 효율성을 떨어리고 해시 함수의 안정성을 깨뜨리는 충돌 공격이 가능하지 않아야한다.

압축효과

  • 원본 데이터의 크기 및 길이가 크더라도 해시 함수를 통해서 만들어진 해시값은 일정한 길이의 데이터여야 한다.
  • 10GB 파일도 256bit의 해시값으로 표현되어야 하며 무결성이 보장되어야한다.

단방향 암호화

  • 해시하는것은 원본 데이터를 뭉갠다 라는 표현을 쓴다.
  • 절때 복호화가 불가능하여야 하며 해시값을 가지고 원본값으로 역산할수 없어야한다.

눈사태 효과

  • 입력값의 아주 작은 변화로도 해시값이 전혀 다르게 도출되어야한다.
  • 예제를 보자

Code

1
2
3
4
5
6
7
8
let string = "theo";
console.log("===== theo  -> sha256 =====");
console.log(shajs('sha256').update(string).digest('hex'));


let string2 = "theo.";
console.log("===== theo. -> sha256 =====");
console.log(shajs('sha256').update(string2).digest('hex'));

Result

  • 단순히 입력된 데이터의 값에 . 1bit를 추가했을때 나오는 hash 값이 전혀 일치 하지 않는걸 알수있다.
  • 이렇게 눈사태 효과를 줌으로써 암호학적 해시 함수의 안정성 및 계산이 불가능 하게 만드는 특징을 가지고 있다.

대표적인 암호학 해시 함수

  • 대표적인 암호학 해시 함수 알고리즘은 MD5 와 SHA가 있다.
  • 각각의 특징 짧게 알아보자

MD5(Message-Digest algorithm 5)

  • 128 비트 암호학 해시 함수이다.
  • 1991년에 MD4를 대체하기 위해 고안됬다.
  • 1996년에 암호화 결함이 발견되었고 2008년에 결함을 이요해 SSL 인증서를 변조하는 것이 가능하다고 발표되었다.
  • 현재는 절때 사용해야하지 말아야 할 암호학 해시 함수 이다.

SHA(Secure Hash Algorithm)

  • 미국 국가안보국(NSA)가 설계 했으며 미국 국가 표준으로 지정되어있다.
  • SHA-0: 최초의 함수는 SHA 라고 불리고 나중에 설계된 함수들과 구별하기 위해 SHA-0 로 통칭했다.
  • SHA-1: SHA-0을 변형한 함수 이다.
  • SHA-2: SHA-1 을 변형하여 SHA-224, SHA-256, SHA-384, SHA-512 의 4가지 변형 함수가 나왔고 이들을 통칭해 SHA-2라고 한다.
  • SHA-2 의 함수 뒤에 붙는 숫자에 따라 해시값 크기 및 블록 크기등이 결정된다.

  • 현재는 SHA-256 이상의 알고리즘을 사용하기를 권장한다. 왜??
  • SHA-0 및 SHA-1은 충돌이 발견되었다.
  • 또한 SHA-2도 SHA-1을 변형한 함수이기 때문에 공격이 발생될 가능성이 있다고 지적한다.

암호학적 해시 함수의 단점 및 암호 노출 방법

  • 암호학적 해시 함수는 알고리즘을 이용하여 원본데이터를 해시화 하는것이기 때문에 언젠가는 충돌이 발견되고 공격이 성공한다.
  • 아직 지구상의 계산값으로는 SHA-256을 사용해도 크게 상관이없다고 권장을 하지만!
  • 언젠가 지구상의 계산값이 더 빨리지면 암호가 뚫릴수 있다고 생각된다.
  • 또한, 1)Rainbow table 공격 및 2) Brute-force_attack 공격에 비밀번호가 노출 될 확률이 있다.
  • 각각의 공격을 정의해보자

무차별 대입 공격(Brute-force_attack)

  • 해시함수는 빠르다.
  • 그렇기 떄문에 무차별적인 데이터를 넣다보면 암호화가 무너질수 있다.

Rainbow table 공격

  • 해시 함수는 입력된 값이 같으면 언제나 같은 결과를 나타낸다.
  • 그렇기 때문에 사용자의 암호유형을 정의한 Rainbow table을 만들어 하나씩 대입해 보면서 암호를 발견해 낼수있다.

암호학적 해시 함수 단점의 보안법

1) Key Stretching(키 스트레칭)

  • 말 그대로 키 스트레칭 쭉 늘린다는 것이다.
  • 해시 암호화를 여러번 반복하여서 암호학적 문제가 발생하는 점을 줄일수있다.
  • 무차별 대입 공격 을 방지하는 효과가 있다.

2) 솔팅(Salting)

  • 말 그대로 솔팅 소금을 친다는 것이다.
  • 실제 암호의 앞 혹은 뒤 혹은 앞뒤 어느곳에다가 솔트된 데이터와 원본 패스워드를 넣어 해시값을 만든다.
  • Rainbow Table 공격을 방지하는 효과가 있다.

여러 라이브러리

  • 개발자가 보완법 키 스트레칭 및 솔팅을 하여 SHA-256을 가지고 자신만의 암호화 시스템을 구축하여도 좋다.
  • 하지만 이미 많은 개발자 및 암호학자들이 만들어낸 강력한 라이브러리 들이 있어서 2가지를 알아보자.

PBKDF2

  • 솔트를 적용한후 키 스트레칭을 임의로 선택할수있는 function이다.
  • 아주 가볍고 구현하기 쉬운 장점이 있다.
  • 미국표준기술(NIST) 에서 승인된 알고리즘이고 미국 정부 시스템에서도 사용하는 알고리즘 이다.

bcrypt

  • 패스워드 저장을 목적으로 1999년에 발표된 메커니즘이다.
  • 아직까지도 가장 강력한 해시 메커니즘으로 알려져있다.
  • 보안에 집착하기로 유명한 OpenBSD에서도 기본 알고리즘으로 활용하고있다.
  • 필자는 Spring Security 에서 사용해 본적이있다.
  • 많은 언어에서 지원이 가능하며 쉽게 접할수 있는 암호화 방식이다.
  • 추가로 사용법을 포스트 해보겠다.

Reference

0%