해시 (Hash)

GreenBean·2021년 8월 1일
0
post-thumbnail
post-custom-banner

Hash

  • 해시(Hash)란 단방향 암호화 기법으로 해시 함수(해시 알고리즘)를 이용하여 고정된 길이의 암호화된 문자열로 바꿔버리는 것을 의미
  • 해시 함수(Hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
    • 이 때 매핑 전 원래 데이터의 값을 키(Key), 매핑 후 데이터의 값을 해시값(Hash value), 매핑하는 과정을 해싱(Hashing)이라고 함

Tip! 해싱암호화

  • 해싱과 암호화는 일상에서는 어느정도 통용되지만, 암호학적으로 본다면 차이가 있다. 가장 큰 차이는 '방향성'이다.
  • 단방향, 즉 복호화가 불가능 하다는 것이고 이를 '해싱'이라 부른다. 반면에 '암호화(Encryption)'는 해싱하고는 다르다. '암호화'는 '양방향'이다. 즉, 암호화를 하면 역으로 복호화도 가능한 것이다.

Tip! 복원이 불가능한 단방향 암호화

  • 단방향 암호화란 이름 그대로 한쪽 방향으로만 암호화를 한다는 의미이다. 즉, 암호화 방법은 있으나 복호화 방법은 없다는 것이다. 그래서 비밀번호를 암호화 할 때에는 거의 대부분 이 방법을 사용한다.
    • 원문(평문) : 암호화되지 않은 원래의 문장
    • 암호화 : 특정 알고리즘이나 방법을 이용해서 원문을 다른 문장으로 변경시키는 것
    • 복호화 : 암호화 때 사용한 알고리즘이나 방법을 이용해서 암호문을 다시 원문으로 변형시키는 것

해시 (Hash)

  • 해시 알고리즘은 종류가 다양하고 알고리즘마다 해시 길이가 다름
  • 해시 알고리즘은 모두에게 공개되어있음
    • 즉, 해커에게도 공개되어있음
    • 그래서 이미 보안이 뚫린 해시 함수가 존재하는데, MD5, SHA-1, HAS-180은 사용해선 안됨
    • SHA-256, SHA-512 등을 사용하기를 권고하고 있음
  • 해시 알고리즘은 특정 입력에 대해 항상 같은 해시 값을 리턴하기 때문에 이를 이용해 인증이 가능
    • 어떤 입력인지 몰라도 해시 함수를 이용해서 해시된 값이 일치하면 입력이 같다는 것이 인증되는 것
  • 입력은 만들어낼 수 있는 값의 길이 제한이 없어 무한정으로 만들 수 있지만 해시값은 항상 고정된 길이의 값으로 나타나기 때문에 한계가 있음
    • 다른 입력이지만 같은 해시값이 나오는 경우가 있을 수 있음
    • 중복이 적게 나타날 수록 좋은 해시 함수
  • 단순히 해시 함수를 이용해서 변환한다고 해서 완벽하지 않는데, 해커가 무차별적으로 임의의 값을 입력하면서 입력된 값을 알아낼 수 있기 때문
    • 이 점을 보완하기 위해 비밀번호에 솔트(Salt)라는 특정 값을 넣는 방법이 있고, 해시 함수를 여러번 돌리는 방법이 있음
    • 두가지 방법을 합하여 입력값에 Salt값을 붙여서 여러번 반복 해싱할 수도 있음

Tip! 솔트(Salt)란?

  • 솔트란 해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것을 말한다. 단어 뜻 그대로 원문에 임의의 문자열을 붙인다는 의미의 '소금친다(Salting)'는 것이다.
    • 이렇게 하면 설령 다이제스트(Digest)를 알아낸다 하더라도 Password 를 알아내기 더욱 어려워진다. 그리고 사용자마다 다른 Salt 를 사용한다면 설령 같은 비밀번호더라도 다이제스트의 값은 다르다. 이는 결국 한 명의 패스워드가 유출되더라도 같은 비밀번호를 사용하는 다른 사용자는 비교적 안전하다는 의미기도 하다.
    • 물론 솔팅할 문자열이 간단하거나, 짧으면 큰 의미는 없어진다. 가장 효과적인 방법을 구축하려면 적어도 각 사용자별 고유의 솔트를 갖고있어야 하며 솔트의 길이는 32비트 이상이 되어야 솔트와 다이제스트를 추측하기 어렵다고 한다. 그렇기에 솔트의 경우 암호학적으로 안전한 난수 생성기를 사용하여 예측가능성을 줄여야 한다.
profile
🌱 Backend-Dev | hwaya2828@gmail.com
post-custom-banner

0개의 댓글