프로그래밍/General

해싱, 암호화에 대한 정리

Lou Park 2022. 3. 30. 00:34

 

 

# 단방향 암호화 (One-way Encryption)

*단방향 알고리즘? 암호화했을때 다시 평문으로 복호화할 수 없는 암호화 알고리즘이다. 

 

해시함수 (Hash Function) / 해시 알고리즘 (Hash algorithm)

임의 길이의 메세지를 고정 길이의 해시 값으로 변환시켜주는 단방향성 함수, 알고리즘

아주 작은 확률로 입력값이 다름에도 출력값이 같은 경우가 발생하는데, 이를 해시 충돌이라고 한다. 이 충돌 확률이 낮을 수록 좋은 함수로 평가된다.

 

해시값, Fingerprint, Message Digest

모두 같은 말이다. 단방향성 해시 함수의 출력값이다.

 

대표적인 단방향 알고리즘

MD5

임의 길이의 메세지를 512bit 단위로 처리해 128bit로 암호화 한다.

애국가 가사 4절 전부를 MD5로 해시해보면 해시값은 아래와 같이 나온다. 취약점이 발견되어 보안관련 용도로는 사용하지 않는 것이 좋다. 

29EFA6A16CD687992B70DF038BACDEC2

 

SHA-1

최대 2의 64승bit 길이의 메세지로부터 160bit 해시 값을 만들어 낸다. MD5보다 빠르고 더 높은 보안성을 가지고 있다. 

패딩은 512bit 단위로 적용된다.

30832907f6d3414c5a13fcab997c0aed866d1132

*Android Keyhash는 SHA-1 값을 Base64로 인코딩한 값이다.

 

SHA-256 

SHA(Secure Hash Algorighm) 알고리즘의 한 종류로서 256bit의 고정된 결과 값을 출력한다. 

아직까지 충돌이 발견되지 않았으면서도 해시 속도가 빠르다는 장점때문에 블록체인에서 하나의 트랜잭션에 대응하는 ID로서 SHA-256 해시를 사용한다. 작업증명에서도 채굴자에게 앞자리수가 N개의 0으로 고정되는 해시값을 찾아내도록 하는데 이때도 사용된다.

d383ac34e131bb51c7a5e2b317619549782ceccf263153e35b974f4f8c95c711

 

# 양방향 암호화 (Two-way Encryption)

암호화된 암호문(CipherText)을 복호화하여 평문으로 돌릴 수 있는 알고리즘이다. 대칭키, 비대칭키 알고리즘이 있다.

 

대칭키 암호화 방식

대칭키 암호화 방식은 암/복호화시 사용하는 키가 동일한 암호화 방식을 말한다. 이때 사용하는 키를 비밀키(Secret Key)라고 하는데, 이는 절대 외부에 유출되어서는 안된다. 암/복호화에 쓰이는 키의 길이가 비대칭키에 비해 짧아서 속도가 빠르다는 장점이 있다. 

 

AES

128bit 블록 암호화 알고리즘이다. 암호화 키는 128/192/256bit 세가지중 하나가 될 수 있다. 

 

비대칭키 암호화 방식

암호화, 복호화할때 키가 서로 다른 암호화 방식이다.

공개키, 개인키를 가지는데 개인키로부터 공개키를 만들어낼 수 있지만, 공개키로부터 개인키를 유추해내는 것은 아주 어렵다. 공개키는 모두에게 알려져있고 메세지를 암호화하는데 쓰이고, 암호화된 메세지는 개인키를 가진자만이 복호화하여 열어볼 수 있다. 

 

대표적인 암호화 알고리즘

RSA

소인수 분해의 난해함에 기반한 비대칭키 알고리즘. 현재 널리 쓰이고있다. RSA는 개인키로 암호화하여 공개키로 열어보는 것이 가능하여 전자서명에서도 사용할 수 있다.

- HTTPS 프로토콜의 TLS 암호 규약에서 사용

 

ECDSA

타원곡선암호를 전자서명에 접목시킨 암호 알고리즘. RSA와 비교했을때 ECDSA의 키가 더 짧아 속도 측면에서 빠르다.

암호화폐에 거래에 주로 사용되는데, 공개키인 계좌주소를 통한 화폐를 개인키로 열어서 사용할 수 있어 계좌 주인만이 암호화폐를 사용할 수 있도록 보장해준다.

 

 

# 번외

Base64

Binary 데이터를 우리가 읽을 수 있는 텍스트로 인코딩하는 방식이다. 암호화된 데이터가 binary 이기때문에 데이터 교환시 불편한점이 많아 실제 암호화 구현시에는 암호화된 결과 byte[]를 Base64로 인코딩해서 사용한다.

 

패딩 (Padding)

정해진 길이의 블록단위로 암호화하는 암호 시스템에서 블록의 크기를 일정하게 맞추기 위해 빈 부분을 채워주는 것이다. 일반적으로는 PKCS#5와 PKCS#7에 정의된 패딩 알고리즘이 널리 사용된다.

 

솔트 (Salt)

똑같은 해시 알고리즘을 거치면 항상 똑같은 해시값이 나오는데, 그러면 이에 대한 데이터를 축적하여 유추가 가능해진다. (레인보우 테이블같은...) 그래서 임의의 문자열을 추가해서 암호화를 하여 일반적으로 유추할 수 없도록 만드는데, 이때 더하는 값을 솔트라고한다.