Dev

해시 충돌이 위험한 이유와 암호화 알고리즘

frog-in-well 2022. 11. 8. 20:43

해시 충돌이 위험한 이유?

해시는 무한한 입력값을 받고, 유한한 출력값을 내므로 근본적으로 충돌을 피할 수 없다.(비둘기집의 원리)

해시 함수에서 중요한 것은 계산을 통한 임의의 충돌을 찾아내는 것이 불가능해야 한다는 점이다.

해시의 출력값은 파일의 위변조 여부를 가리는 수단이므로 임의의 충돌을 찾아내는 것은 문제가 된다.

암호화 알고리즘

단방향 암호화인 해싱은 데이터의 변조와 무결성을 확인하기 위해 사용된다.

양방향 암호화는 데이터를 교환할 때 노출을 막기 위해 사용된다.

1. 양방향 암호화 알고리즘 (암호화 / 복호화)

양방향 암호는 대칭형 암호와 비대칭형 암호로 나눌 수 있다. 이는 암호화에 사용하는 키와 복호화에 사용하는 키가 같은지 다른지를 기준으로 구분한다.

일반적으로 대칭형 암호는 비공개키 암호에, 비대칭형 암호는 공개키 암호에 사용된다.

HMAC

  • 비공개키 방식 - 대칭키를 사용한다.
  • 해싱과 대칭키를 사용하는 방식이다. 해싱 암호 키를 송신자와 수신자가 미리 나눠 갖는 것이 일반적인 해싱과의 차이점이다.
  • 송신자는 원본 메세지와 해싱된 메세지를 수신자에게 보낸다.
  • 수신자는 원본 메세지를 대칭키로 해싱한 뒤 수신된 해싱 메세지와 비교한다.

RSA

  • 공개키와 개인키를 사용한다.
  • 일반적으로 공개키를 암호화에 사용하고, 만약 개인키를 암호화에 사용한다면 디지털 서명 기능을 수행할 수 있다.
    • SSL/TLS에서 CA가 자신의 개인키로 암호화 한 인증서 서버에게 전달, 공개키를 브라우저에게 전달
  • 메세지를 encrypt 하기 위해 공개키를 사용하고, 개인키를 이용해 decrypt 한다.
    • JWT 방식에서는 개인키를 가진 사람만 JWT를 생성할 수 있는데?
    • RSA를 이용한 JWT에서는 개인키를 sign을(encrypt) 위한 용도로 사용하고, 공개키를 토큰을 verify하기 위해 사용한다.

2. 단방향 암호화 알고리즘 (해시)

2.1 해시 함수의 종류

1. MD5

임의의 길이의 값을 입력받아서 128비트의 해시값을 출력.

속도가 매우 빠르기 때문에 salt를 이용해도 브루트 포스에 취약하다.

2. SHA

  • SHA-0, SHA-1SHA-1에서 마찬가지로 160비트 해시값 사용, 취약점 발견되어 SHA-2 등장.
  • SHA-0에서 160 비트의 해시값 사용, 해시 충돌(취약점) 발견되어 SHA-1 발표
  • SHA-2일반적으로 SHA-256을 많이 사용한다.
  • 해시 길이가 길어졌기 때문에 비교적 안전하지만, 알고리즘의 기본 동작이 SHA-1과 큰 차이가 없기 때문에 완전히 안전하다고 보장할 수는 없다.
  • 해시값으로 224,256,384,512 비트를 선택해서 사용할 수 있다.
  • SHA-3

해싱에서 레인보우 테이블 공격을 방지하는 방법에는 레인보우 테이블이 쓸모없게 만들거나, 해싱을 아주 느리게 수행하여 레인보우 테이블을 만들 수 없도록 하는 방법이 있다.

첫번째 방법은 salt를 이용하는 방법이 있다.

bcrypt는 두번째 방법을 이용한다. 해시 함수의 빠른 처리속도는 브루트 포스에 취약하다는 단점이 될 수 있다. 해싱 속도가 빠른 bcrypt에서는 해싱의 반복 횟수를 늘려(키 스트레칭) 연산 속도를 늦추는 방법을 선택한다.

솔팅과 키 스트레칭을 반복하는 방법에는 PBKDF2, Bcrypt, Scrypt 등이 있으며 일반적으로 해싱에 권장되는 방법들이다.

3. Bcrypt

  • Node.js의 Bcrypt 모듈을 사용할 수 있다.

4. Scrypt

  • Node.js의 crypto 모듈에서, crypto.scrypt()를 통해 적용가능하다.
  • CPU를 통한 연산 속도가 느리더라도, GPU를 이용한 병렬 연산으로 공격이 가능한 점을 보완한 방식이다.
  • CPU 연산뿐만 아니라 메모리를 사용해야 해싱이 가능하도록 구현한 방식이다.