반응형

HMAC(Hash-based Message Authentication Code)

메시지 인증 코드(Message Authentication Code, MAC)는 메시지의 인증에 쓰이는 정보(코드)이다. 메시지의 무결성 및 신뢰성을 보장하는 용도로 MAC을 사용한다.

무결성이란, 서버 입장에서 클라이언트로부터 API 요청을 받았을 때, 이 요청이 신뢰할 수 있는 것인지 (정보가 중간에 변경없이 그대로 전달된 것인지)에 대한 성질을 말한다.

 

HMAC은 인증을 위한 Secret Key와 임의의 길이를 가진 Message를 해시 함수(알고리즘)을 사용해서 생성한다. 해시 함수로는 MD5, SHA-256과 같은 일반적인 해시 함수를 그대로 사용할 수 있으며 각 알고리즘에 따라 다른 고정길이의 MAC(Hash value)가 생성된다.

- Secret Key: 서버와 클라이언트가 함께 알고 있는 외부로 유출되어서는 안되는 값.

- Message: 클라이언트가 전송하는 요청의 전체(Header + Body)가 될 수도 있고, URL만 될 수도 있다.

 

여기까지가 일반적인 HMAC에 대한 정의이고, 위의 내용만 보면 이해가 쉽지 않아 아래에 좀 더 쉽게 설명하자면,

HMAC은 해싱기법을 이용해서 메시지의 위변조가 있었는지 체크하는 인증 기법이다.

해싱 자체는 원문 메시지를 일정한 길이의 다른 메시지로 변환하되, 일정 길이로 떨어지게 하는 기법. 원문을 해싱하여 나온 메시지를 다이제스트 라고 한다.

해싱의 결과는 유일하고(즉, A를 언제든 같은 해싱 기법으로 변환하면 항상 A' 가 된다), 해싱을 풀어 원문을 찾아낼 수 없다는 것이 장점.

 

HMAC으로 메세지 위변조 감지 절차

1. 메시지 보내는 쪽과 받는 쪽을 가정하고 이 둘은 두 가지를 공통적으로 알고 있어야한다.  그리고 어떤 HMAC 알고리즘 사용할지.(HMAC의 종류가 다양하므로) HMAC-SHA256 알고리즘을 사용한다고 가정한다면(그림에서 HMAC-SHA256 알고리즘은 암호화 알고리즘이 아님)

2. 보내는 쪽에서 보내고 싶은 내용이 있고, 그리고 공통의 KEY(SecretKey)가 있다. 이를 사용해서 보내는 쪽에서 시그니처 Signature라는 것을 생성하는데, 이 값은 메시지의 hash 값이다. KEY와 내용을 HASH 알고리즘에 적용하면, 시그니처가 생성된다.

 

3. 받는 쪽에서도 KEY(SecretKey)를 알고 있고 알고리즘도 알고 있다. 받는 쪽에서도 똑같이 Signature를 만든 후, 이를 받은 Signature와 맞는지 검증한다.

 

4. 중간에 메시지가 위조되었다면, "보낸 시점의 메시지와 받은 시점의 메시지가 다르니까 signature도 다르게 나올것이다." 라는 것이 HMAC의 컨셉이다.만약 signature까지 위조하려고 해도, 위조자는 KEY 값을 모르니까 위조할 수 없다는 점이 HMAC의 장점.

HMAC-SHA256에서 SHA-256은?SHA- 시리즈들은 Secure Hash Algorithm 이라는 이름으로, 해시 알고리즘의 종류들을 말한다. SHA-1, SHA-2 .. 등이 있는데, 중간에 모든 숫자가 있는 건 아니다. SHA-2 는 다이제스트의 길이가 다양한데, 이 중 다이제스트의 길이가 256byte인 것을 SHA-256이라고 한다.

반응형

'Tech develop > 인증' 카테고리의 다른 글

RSA 암호 알고리즘이란?  (0) 2021.07.29
블록 암호화에서의 운영 모드 및 패딩  (0) 2021.07.29
[Android] WhiteBox  (0) 2021.07.29
Android KeyStore 와 Keystore 의 차이  (0) 2021.07.29
,
반응형

RSA 암호 알고리즘이란?

Rivet, Shamir, Adelman 세사람의 첫이름을 따 RSA라고 만든 암호 알고리즘이다.

RSA 암호 체계는 미국 MIT에서 개발한 공개키 암호 시스템이다.

 암호 알고리즘의 핵심 큰 정수의 소인수 분해가 어렵다는 점을 이용하여 암호화를 시킨다.

이러한 RSA 암호 알고리즘은 전자상거래에서 가장 흔히 쓰고있는 공개키 알고리즘이다.

주로 적은 양의 데이터나 전자서명에 사용한다.또한 RSA 암호는 대칭키인 DES나 AES보다 속도가 느리므로 메시지 암호화에는 쓰이지 않고 주로 키를 암호화하는데 쓰인다.

 

RSA 암호 알고리즘 방식

1. A가 B에게 정보를 안전하게 보내고 싶어한다. 이때 RSA 알고리즘을 이용하고자 한다.

2. B가 공개키와 개인키를 만들어 A에게 공개키를 보낸다. (개인키는 B만 가지고 있다.)

3. A가 B로부터 받은 공개키를 이용하여 보낼 정보를 암호화한다.

4. A가 암호화된 정보를 B에게 보낸다.

5. B가 암호화된 정보를 받고 개인키를 이용하여 암호를 해독한다.

 

RSA 암호 알고리즘 원리

1. 개인키와 공개키 만들기

RSA 암호 알고리즘 첫 단계는 공개키와 개인키를 만드는 것이다.

공개키는 n,e라는 두 정수로 이루어져있고 개인키는 n,d라는 두 정수로 이루어져있다.

n 구하기

임의의 두 소수 p와 q를 정하고 n = p * q를 해주면 n을 구할 수 있다.

e 구하기

Φ(n) = (p - 1) * (q - 1)식을 이용하여 Φ(n)을 구한다.

e는 1 < e < Φ(n)로써 1과 Φ(n) 사이에 있고 Φ(n)와 서로소인 e를 정해주면 된다.

이러한 e는 공개키에 이용이 될 것이다.

서로소란 1 이외에 공약수를 가지지 않는 수를 의미한다.

d 구하기

(e * d) mod Φ(n) = 1

즉, e*d를 Φ(n)으로 나누었을 때 나머지가 1인 d를 구하면 된다. 이때 d는 개인키에 사용될 숫자이다.

이제 공개키에 이용될 (n, e)와 개인키에 이용될 (n, d)를 모두 구하였다. 즉, 개인키와 공개키가 생성되었다.

 

2. 암호화하기

STEP 1에서 구한 공개키를 이용해서 정보를 암호화 한다.

원래 정보를 M이라 하고 암호화된 정보를 C라 하자.

위의 식을 이용하여 M을 C로 암호화 하면 된다.

이때 암호화를 할 때 e와 n의 값을 알아야 하므로 공개키(n, e)가 있어야 암호화 할 수 있다는 것은 자명하다.

 

3. 복호화하기(해독하기)

이제 암호화되어 온 정보 C를 복호화(해독)할 순서이다.

페르마의 소정리에 의해 1번식이 성립하면 2번식도 성립하게 된다.

암호화 할때는 1번식을 사용했으므로 복호화 할때는 위의 식 즉, 2번식을 이용하여 복호화를 한다.

이때 암호화된 정보 C를 M으로 복호화(해독)할 때는 n과 d값을 알아야 한다.

이때 이 값을 아는 사람은 개인키(n, d)를 가진 사람 B 뿐이다.

반응형
,
반응형

블록 암호화에서의 운영 모드 및 패딩

암호화 할때, 운영 모드를 어떤 것을 할지 고민 일때 참고용.

ex> AES/CBC/PKCS7Padding

 

1. ECB (Electronic Code Block) Mode

- 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조이다.

- 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. (Brute-Force Arttack, Dictionary Attack)

- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding을 해야한다.

 

- error propagation : 각 블록이 독립적으로 동작하므로 한블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다. 해당 블록까지 에러 전파.

 

2. CBC(Cipher Block Chaining) Mode

- 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용된다.

- 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용된다. 이 때, IV는 제 2의 키가 될수 있다.

- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 Padding을 해야만 한다.

- 암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다.

- error propagation : 깨진 암호문의 해당블록과 다음블록의 평문까지 영향을 미치게 됩니다. 두번째 복호화의 Ciphertext가 깨졌을 때 참조.

 

3. CFB(Cipher FeedBack) Mode

- 블록 암호화를 스트림 암호화처럼 구성 평문과 암호문의 길이가 같다(패딩이 필요 없다)

- 최초의 키생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있다.

- 스트림의 기본단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 CFB8~CFB128로 쓰인다.

- 암호화, 복호화 모두 암호화로만 처리할 수 있다.

- CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있다.

 

- error propagation : CBC모드와 마찬가지로 한 암호문블럭의 에러는 해당평문블록과 다음 평문블록, 이렇게 총 2개의 블록에 전파된다.

 

4. OFB(Output FeedBack) Mode

- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다.(패딩이 필요없다)

- 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나온다. (복호화시에 암호화)

- 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있다.

- 스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰인다.

 

- error propagation : 해당블록까지만~ 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitized analog신호에 많이 사용된다.

 

5. CTR (CounTeR) Mode

- 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키스트림을 만든다. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 된다.

- CTR모드는 OFB와 같은 스트림 암호의 일종이다.

- CTR모드의 암복호화는 완전히 같은 구조가 되므로 구현이 간단하다.(OFB와 같은 스트림 암호의 특징)

- CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수있다.(비표와 블록번호로부터 카운터를 구할 수 있기때문에)

- 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미한다.(병렬처리 가능)

- error propagation : 각 블록이 병렬처리 되므로 같은 블록내에서만 이루어짐.

 

- PKCS#5

암호 블록 사이즈가 8바이트에 맞춰져있다.

8바이트의 배수로 인풋을 맞춰줘야하는데 패딩에 들어가는 문자는 패딩할 갯수가 들어간다.

예시)

AA 07 07 07 07 07 07 07 : 1바이트 데이터 + 7바이트 패딩

AA BB 06 06 06 06 06 06 : 2바이트 데이터 + 6바이트 패딩

AA BB CC 05 05 05 05 05 : 3바이트 데이터 + 5바이트 패딩

주의 : 데이터가 8바이트인 경우에는 패딩이 필요 없어 보여도, 08을 8번 패딩한다.

 

AA A9 A8 A7 A6 A5 A4 A3 08 08 08 08 08 08 08 08 : 8바이트 데이터 + 8바이트 패딩

 

- PKCS#7

패딩할 숫자만큼 패딩 값을 채워넣어서 붙여주는 것은 PKCS#5와 동일.

따라서, 8바이트의 암호화 블럭 크기인 경우 PKCS#5 = PKCS#7이다.

하지만 현대의 암호화에서는 당연히 더 긴 암호화 블럭을 사용하기 때문에 달라진다.

AES256의 예를 들면, 256bit의 키를 사용하게 되고, 블럭 사이즈는 128bit이므로 32바이트의 키와 16바이트의 암호화 블럭을 사용하게 된다.

 

이 상황에서 PKCS#7은 패딩이 최대 16개까지 가능하다.

(8바이트인 경우 08을 패딩 8번 하듯이 10으로 패딩 16번을 수행한다.)

PKCS#7은 최대 가능한 패딩은 FF이므로, 255개가 된다.

 

두 개의 차이라 하면, PKCS#5는 8바이트 고정길이, PKCS#7은 1~255바이트의 가변길이이다.

반응형

'Tech develop > 인증' 카테고리의 다른 글

HMAC(Hash-based Message Authentication Code)  (1) 2021.07.29
RSA 암호 알고리즘이란?  (0) 2021.07.29
[Android] WhiteBox  (0) 2021.07.29
Android KeyStore 와 Keystore 의 차이  (0) 2021.07.29
,