[보안] Hash, MD5, SHA

Hash 값은 복호화가 불가능 하다고 하는데, 복호화를 해준다고 한다. 

상반되는 내용에대해  찾아보다가 암호화, 복호화, 해싱에 대해 좀 더 자세히 찾아보았다.

  1. 암호화하다 (暗號化–) [동사] 통신할 내용을 일정한 체계에 따라 암호로 바꾸다.
  2. 컴퓨터 =디코드(부호화된 데이터를 인간이 알기 쉬운 모양으로 하기 위하여 또는 다음 단계의 처리를 위하여 번역함).
  3. 해싱 명사 정보·통신 해싱 함수를 이용하여 자료를 검색하는 방법데이터를 해시 테이블이라는 배열에 저장하고해싱 함수를 이용하여 데이터가 위치한 곳의 주소를 찾기 때문에 신속하게 원하는 자료를 검색할  있다.
    출처 :네이버사전

결론적으로는, MD5나 SHA1 사용은 지양해야할 것이며,  되도록이면 SHA-256 또는 SHA-512를 권장한다.
 *MD5사용시 Salt를 추가할 것

 

 

MD5  참고 : https://ko.wikipedia.org/wiki/MD5 (위키백과)


MD5(Message-Digest algorithm 5) 는 128비트 암호화 해시 함수이다. RFC 1321로 되어있으며, 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사등에 사용된다. 1991년 로널드 라이벳트가 MD4를 대체하기 위해 고안했다.

1996년 MD5의 설계상 결함이 발견되었다. 치명적인 결함은 아니였지만, 암호학자들은 SHA-1과 같은 다른 안전한 알고리즘을 사용할 것은 권장.
2004년 더욱 심한암호화 결함이 발견 됨.      
2006년 당시 노트북 컴퓨터 한 대의 계산 능력으로 1분 내에 해시 충돌을 찾을 정도로 빠른 알고리즘이 발표.
2008년 MD5의 결함을 이용하여 SSL 인증서를 변조하는 것이 가능 하다고 발표

따라서, 현재 MD5를 보안 관련 용도로쓰는 것은 권장하지 않는다.       

추가적으로, Hash 암호화는 1.대칭형암호(비밀키 암호) 2. 비대칭형 암호(공개키 암호) 3.단방향 암호 중
단방향 암호이다. 해싱을 통해 평문을 암호화하는 것은 가능하지만 암호문을 평문으로 복호화 하는 것은 불가능하다.

 

MD5 인코딩

MD5 암호화를 웹상에서 해주는 곳이 있어서 가져왔다.  이동(클릭)
TextBox에 원하는 Text를 입력하고 Crypt를 입력하면 MD5 해시 값으로 바꿔준다.

 예 )yeongle -> (md5) -> f5e81579acafd51d952cfad5624b4a3d

MD5로 해시된 값을 다시 위에 링크된 사이트에 들어가서 MD5 Decryption 탭으로 들어가서 붙어넣기 후 실행해보자.
f5e81579acafd51d952cfad5624b4a3d -> (md5 Decryption) -> yeongle

 

MD5Online은 어떻게 단방향 암호를 복호화 했을까?

단방향 암호인 MD5는 복호화가 불가능하다. 하지만 알수는 있다.

String -> MD5
y -> 415290769594460e2e485922904f345d -> y
ye -> 00c66f1a036bd8f9cb709cb8d925d3d9  -> ye
yeong  -> 7b526736dfd932517ba1339656454275 -> yeong
…..
이런식으로 모든 단어의 Hash값을 DB에 저장해 둔 뒤에 맞는 값을 비교하면 된다.
사용자가 MD5Online에 MD5값을 요청하면 원래 String과 MD5값을 저장해두었다가, Decrytption에 사용한다.
이게 가능한 이유는 단.방.향 암호이기 때문에!

 


그렇다면 MD5를 쓰지 말아야 할까?

가능한, SHA256 이나 SHA512를 사용하는 것을 권장한다.  왜냐하면, 128비트인 MD5에 비해 더 복잡한256Bit, 512Bit의 Hash 값을 가지기 때문에, 일일히 비교하기에 더 오랜 시간이 걸린다.
암호등 중요한 데이터는 영어대/소 문자 + 숫자 + 기호 를 조합하여 저장하도록 하며, Salt를 추가한 후 해싱하여야 한다.

Salt란

  1. Salt 미적용
    String password =  “yeongle”; 
    String hash = MD5(password);

  2. Salt 적용
    String passwold = “yeongle”;
    String salt = “dsafjk212#@!das2^&GDSA2312!@”;
    String hash = MD5(salt+password);  // hash = 다이제스트 

사용자가 입력한 암호값(password)에 소금(salt)을 추가한다 (password+salt) 이 상태에서, Hash을하면 MD5(“dsafjk212#@!das2^&GDSA2312!@yeongle”);
로 만들어진 Hash 값(다이제스트) 을 저장하게 된다.  이때 salt 값 도 같이 저장해두게 된다.

Salt는

  1. 20자 이상
  2. 영문 + 숫자 + 특수문자 포함
  3. 사용한 salt를 재사용하지 않을 것

의 규칙을 적용하여 사용하는 것을 권장한다. 
위의 규칙을 지킨다면 hash된 값을 알아도 salt값으로 인해 원래 값을 무한대입하여 알아낼 수는 없을 것이다.

비밀번호 생성

  1. password 와 salt를 더하여 hash
  2. hash된 값과 salt를 DB에 저장

비밀번호 인증

  1. 입력받은 password + DB에 저장된 salt값
  2. 1의 값을 hash 하여 db 에 저장되어있는 값 (다이제스트) 와 비교 

 

 

# 기타 암호화에 관련하여 Naver d2에 좋은 글이 있어 첨부합니다.
https://d2.naver.com/helloworld/318732

 

댓글 남기기