Search
Duplicate
🔒

암호 해싱과 메세지 인증

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
보안
암호
Scrap
태그
9 more properties

메세지 무결성

메세지 무결성이란 메세지가 불법적으로 수정되지 않았음을 보장하는 것이다. 아날로그 문서에서는 지문, 도장 등을 통해서 문서의 무결성을 보장해왔다. 그렇다면 디지털 문서에서 문서의 무결성을 보장하는 방법은 무엇일까? 바로 Message Digest가 있다.

Message Digest

Message Digest란 메세지에 암호 해싱을 적용하여 생성한 결과물이다.
// 간단한 예시 func Hash(message) => fingerprint
Swift
복사

무결성 점검 과정

현재 송신자가 보낸 메세지의 무결성을 점검하려면, 아래 두가지 내용을 비교한다.
전송된 메세지로부터 생성된 Message Digest
기존에 저장되어 있던 Message Digest
두가지를 비교해서 같다면 무결성이 검증된 것이고, 다르다면 메세지가 수정되었다는 것을 알 수 있다.

암호 해시 함수의 정의

암호 해시 함수란 간단하게 반대 방향으로의 복원이 거의 불가능한 해싱 함수라고 생각하면 쉽다. 이 해시 함수는 입력된 데이터를 고정된 길이의 데이터로 변환한다. 암호 해시 함수가 안전하게 작동하려면 아래의 세가지 조건을 만족시켜야 한다.

암호 해시 함수의 조건

1. Preimage Resistance (단방향성)

y = Hash(M) 일 때, 공격자가 (y, H)에서 M을 발견하는 것이 매우 어려워야 한다.
즉, 공격자가 암호 해시 함수를 적용한 결과를 안다고 해서, 역으로 해시 함수를 풀어서 메세지를 발견하는 것이 불가능 해야 한다. 만약 이 규칙을 지키지 않는다면, 암호 해시함수를 사용할 이유가 없다.

2. Second Preimage Resistance (약한 충돌 저항성)

M과 H(M)이 주어질 때, M’ ≠ M 이면서 H(M’) = H(M) 인 M’를 찾기가 어려워야 한다.
즉, M과 H(M)을 안다고 했을 때, 완전 탐색으로 가능한 모든 M’을 넣었을 때 H(M)과 같은 H(M’)이 나오는 경우가 없어야 한다.
하지만 SHA-1의 경우, Google에서 1년 6개월 정도간의 노력 끝에 이 조건을 만족하는 M’를 찾아내었다. 결과적으로 SHA-1 알고리즘이 완전히 안전하지 않기 때문에 현재는 SHA-2를 사용하는 곳이 많고, SHA-3 알고리즘까지 사용하는 곳도 있다.
SHA란? Secure Hash Algorithm의 약자로 암호학적 해시 함수들의 모음이다

3. Collision Resistance (강한 충돌 저항성)

H(M) == H(M’)인 서로 다른 메세지 M과 M’을 찾기 어려워야 한다.
아무생각없이 보면 2번과 같은 내용으로 볼 수 있지만, 2번과 3번은 가정이 다르다. 2번은 M과 H(M)이 주어진 상태에서 하나의 메세지를 고르지만, Collision Resistance에서는 M과 M’을 모두 공격자가 임의로 고를 수 있다.

암호 해시 함수 공격의 유형별 난이도

상용 암호 해시 알고리즘의 n의 값은 128이상을 요구한다.
결국, 해시 함수의 결과로 나오는 bit의 길이가 길어질 수록 안전하지만, 그만큼 용량, 데이터의 부담은 늘어난다.

상용 암호 해시 알고리즘

암호 해시 알고리즘의 종류

MD5
1991년에 만들어진 128비트 알고리즘 (충돌 저항성이 약하다)
SHA-1
1995년에 미국 NIST에서 만들어진 160비트 알고리즘 (충돌 저항성이 약하다)
SHA-2
2002년에 미국 NIST에서 만들어진 알고리즘으로 해시 값의 크기에 따라 SHA-256, SHA-384, SHA-512 등 6개의 해시함수로 나뉘어 진다.
SHA-3
2012년 미국 NIST에 의해 선정된 알고리즘 SHA3-224, SHA3-256 SHA3-384, SHA3-512 / Keccack-256 (Ethereum에 사용됨)
RIPEMD160
1996년에 만들어진 160비트 알고리즘

SHA-512 에 대한 간단한 소개

메세지 인증

MDC(Modification Detection Code)

MDC는 메세지가 변경되지 않았다는 것을 보장하기 위해 사용한다.
MDC를 만드는 방법은 간단하다. 보낼 메세지에 해시함수를 적용시킨 것을 MDC로 활용한다. 이렇게 생성한 MDC와 메세지를 수신자에게 보낸다. 수신자는 받은 메세지를 활용해 다시 해시 함수를 적용하고, 이렇게 적용한 MDC와 수신받은 MDC를 비교해서 같은지 판단한다.
이때, MDC를 insecure channel로 전송하게 되면, 공격자가 메세지와 MDC를 모두 생성해서 전송해버리면 수신자는 공격인지 아닌지 판단할 수 없다. 따라서 MDC 전송에서의 보안에 유의해야 한다.

MAC(Message Authentication Code)

MDC는 메세지의 송신자를 인증하지 못하는 단점이 있다. 그래서 해시 과정에서 비밀 키를 활용해 MAC을 만들어서 전송한다.
MAC = Hash(K + M) // K + M 은 string concat
Swift
복사
이때, 해시 함수가 안전하지 않을 경우 K가 노출될 가능성이 크다! SHA-256과 같이 안전한 함수를 사용하도록 해야한다.

HMAC(Hashed MAC)

NIST에서 사용하는 표준 MAC으로 해시 함수를 적용한 MAC이다. 최종적으로는 2번의 해시를 거치는 Double Hashing이고 사용되는 키값도 ipad, opad와의 xor연산을 활용해서 매우 뛰어난 안전성을 가지고 있다.