학습목표
Hash암호화는 어떤 암호화 방식일까?
Hash는 HashMap, HashSet등의 자료구조에서 많이 보았고, Hash를 사용했었다. hashCode()라는 메소드도 써왔고... Hash에 대한 명확한 정의? 는 모른채 써왔던것 같다. Hash란 무엇이고, 이런 Hash를 사용하는 암호화는 무엇인지, 지난 포스팅의 주제인 AES-128 암호화의 내부 방식에 대해 알기전해 개략적으로 알고가자.
Hash암호화
Hash와 Encryption의 차이
둘다 암호화 기법이지만, Hash는 단방향 암호화 기법이고, Encryption은 양방향 암호화 기법이다.
즉, Hash는 한번 암호화하면 다시 복호화 하는것이 불가능하다. (Encryption은 암호화 후 복호화가 가능하다.)
비둘기 집 원리 (복호화가 불가능한 이유)
왜 해시값은 복호화를 할 수 없는걸까?
Hash의 정의 : "임의의 길이를 갖는 비트열을 입력으로 받아, 정해진 길이의 비트열을 반환하는 함수"
ex)
- 강규영 → 강
- 홍길동 → 홍
- 이몽룡 → 이
Hash함수도 함수이기 때문에, 입력이 같으면 출력도 같다. 어제 hash("강규영")을 수행한 결과가 "강" 이었다면, 오늘hash("강규영")을 수행해도 결과는 "강"이다.
그러나 그 반대는 성립하지 않는다. 해시값 "강"이 나오는 경우는 "강규영" 일수도, "강둘리"가 될수도 있다. 수학에서 X²=4 라면, X의 값이 2일지 -2일지 모르는것과 동일하다.
정의상 모든 해시함수는 치역의 크기 (cardinality)가 고정되어 있고 대체로 저으이역에 비해 작다. 정의역보다 치역이 작으면 입력값은 다르지만 결과값은 같은 경우가 반드시 생길 수 밖에 없다. 이런 현상을 비둘기 집의 원리라 부르며, 비둘기집 보다 비둘기가 더 많은 상황에서 모든 비둘기를 집에 넣으려면 최소 한개이상의 비둘기 집에는 최소 두마리이상의 비둘기가 있을 수 밖에 없는 것이다.
해시함수의 취약성
그렇다면 복호화가 불가능한데, 뭐가 취약하다는 걸까??
만약 사용자들의 PW를 해싱하여 암호화해 저장한 테이블이 해커들에게 탈취되었다고 보자.
비록 테이블 저장내용 자체가 해시값이기 때문에, 바로 비밀번호를 알아내는 것은 불가능하지만,
Hash함수의 특성상, 입력이 같으면 출력도 같다. 탈취한 해시값이 나올때까지 무한히 Hash함수에 입력값을 넣어 알아볼수 있다. 또한 이미 이렇게 Hash함수들의 Hash값을 알아낸 모음집이 있는데 이를 rainbow table이라고 한다.
또, 비둘기집의 원리를 기억하는가?, Hash함수는 정의역과 치역을 1:1매핑 시키지 않는다. 즉, 입력값이 다르나, 동일한 Hash값이 나올수 있으며, 해당 Hash값으로 인해 실제 비밀번호가 다름에도 보안이 뚫릴수 있다.
Feedback
포스팅 작성이 너무 루즈하다. Hash함수에 대한 조사한 내용이 있어 바로 뚝딱 작성될줄 알았으나, 사실 정리되지 않은채로 그냥 복사붙여넣기만 한 자료들이 대부분 이었다. 이런식의 포스팅은 하느니만 못한 포스팅이지 않을까...
알게된 점
- Hash는 복호화가 불가능하다.
- 비둘기집의 원리에 의해 Hash는 충돌이 날수밖에 없다.
알아야할 점
- [ ] Hash 함수의 취약성을 극복할수 있는 방법
- [ ] Hash가 검색에 쓰이는 이유?
- [ ] 사용중인 Hash알고리즘들
References
[Security] 암호화 알고리즘 - 단방향 암호화, Hash
'CS' 카테고리의 다른 글
AES-128 (0) | 2021.08.06 |
---|---|
ReadTimeout (0) | 2021.07.24 |
Page (0) | 2021.06.04 |