암호화는 특정 알고리즘을 사용해서 어떠한 데이터를 아무 의미없는 문자의 나열로 바꾸는 것을 의미한다.
암호화 방식에 따라서 암호화된 데이터를 복호화(Decryption)를 통해 원본 데이터를 확인 할 수도 있지만 어떠한 방법을 쓰더라도 원본 데이터를 확인 할 수 없을 수도 있다.
주로 복호화가 가능한 양방향 암호화를 Encryption이라 하며 복호화가 불가능 한 단방향 암호화를 Hash라 한다.
말 그대로 비밀키를 사용하여 암호화와 복호화를 하는 방식이다.
송신자와 수신자간 동일한 비밀키를 알고 있어야 복호화가 가능하다.
공개키와 개인키라고 불리는 서로 다른 두개의 키를 사용하는 방식이다.
공개키를 이용해 암호화 하여 데이터를 주고 받는 방식은 비밀키 암호화와 비슷한 방식이지만 복호화는 개인키를 가진 사람만 할 수 있다.
일반적으로 패스워드를 암호화 하는 방법중 하나로 단방향 암호화를 의미하며 해시함수(해시 알고리즘)를 통해 데이터를 고정된 길이의 암호화 된 문자열로 바꿔준다.
알고리즘의 종류로는 MD5, SHA-1, HAS-180, SHA-256, SHA-512 등이 있으며 보안 정책상 SHA-256, SHA-512를 권고하고 있다.
이러한 해시함수에 의해 암호화된 데이터를 다이제스트(Digest)라 한다.
동일한 데이터를 알고리즘을 통해 해시화를 할 경우 항상 동일한 결과가 나온다.
이는 이미 해시화된 데이터를 가지고 해시화 전 데이터를 유추 할 수 있게 된다. 실제로 무수한 다이제스트를 저장한 Rainbow table을 이용한 Rainbow attack에 취약하다.
뿐만 아니라 해시함수은 처리속도가 빠르기 때문에 임의의 데이터를 해시화 하여 결과값을 비교하는 억지 기법 공격(Brute force attack, 이하 무차별 공격)에도 취약하다.
Salting - 솔팅의 가장 큰 목적은 Rainbow table을 무의미하게 만드는 것이다. 솔팅이란 말 그대로 패스워드에 양념을 추가하듯 패스워드에 임의의 문자열(이를, salt라 한다) 추가하여 다이제스트를 생성한다. 사용자마다 각각 다른 Salt를 사용하게 된다면 동일한 패스워드를 사용 한다 하더라도 다이제스트는 다르게 생성된다. 참고로 Salt는 최소 128bit는 되어야 안전하다고 한다.
Key Stretching - 키 스트레칭은 패스워드를 해싱하여 다이제스트를 생성하고 이를 다시 해싱하는 방법으로 이를 계속 반복하여 다이제스트를 생성하는 방법이다. 이렇게 되면 입력한 패스워드를 동일한 횟수만큼 해시해야만 패스워드 일치 여부를 확인 할 수 있다. 이를 통해 다이제스트의 생성 속도가 일반적인 해시함수 방식보다 늦춰져 무차별 대입 공격을 통해 패스워드를 추측하는데 많은 시간이 소요되게 한다.
ISO 표준에 적합하며 NIST(National Institute of Standards and Technology, 미국표준기술연구소)에 의해서 승인된 알고리즘으로 솔트를 적용 한 후 해시 함수의 반복 횟수를 임의로 선택할 수 있다.
아주 가볍고 구현하기 쉬우며 SHA와 같은 이미 검증된 해시 함수만을 사용한다.
패스워드 저장을 목적으로 설계된 함수로 OpenBSD의 기본 암호 인증 매커니즘으로 사용되고 있다.
"work factor" 는 하나의 다이제스트를 생성하는데 얼마만큼의 처리 과정을 수행할지 결정하는 인자로 이를 조정하는 것만으로도 간단하게 시스템의 보안성을 높일 수 있다.
PBKDF2와 유사한 함수로 다이제스트를 생성 할 때 메모리 오버헤드를 갖도록 설계되어 다른 암호 기반 KDF에 비해 많은 메모리가 필요하다. 이는 병렬처리에 제한이 생기게 되어 무차별 공격이 어렵게 된다. 따라서 PBKDF2보다 더 안전하다고 평가 되지만 보안 시스템을 구현하는데 있어 비용이 올라가게 된다.