목차
- hmac이란
- C openssl 라이브러리 활용 개발 환경 구성 이전 포스팅
- C openssl hmac 관련 헤더 인클루드 예제
- HMAC 암호화를 위한 비밀키 입력 예제
- SHA256 알고리즘 활용 HMAC 암호화 예제
- 결과확인
1. hmac이란
HMAC (Hash-based Message Authentication Code)은 메시지 무결성을 보장하기 위해 사용되는 암호학적 해시 함수입니다. HMAC은 주어진 메시지와 비밀 키를 사용하여 메시지에 대한 인증 코드를 생성하며, 이를 통해 메시지가 변조되지 않았는지 확인할 수 있습니다.
사용 목적
HMAC은 주로 데이터 무결성 검증과 메시지 인증에 사용됩니다. 예를 들어, 네트워크 통신에서 데이터가 변조되지 않았는지 확인하거나, 사용자의 인증을 검증하는 데 활용됩니다.
알고리즘
HMAC은 특정 해시 함수와 메시지에 대한 키를 결합하여 사용합니다. 주로 MD5, SHA-1, SHA-256 등의 해시 함수가 사용되며, 메시지와 키를 해시 함수에 입력하여 중간 해시 값을 얻습니다. 이 중간 해시 값과 키를 다시 결합하여 최종 HMAC 값을 생성합니다.
보안성
HMAC은 해시 함수의 특성과 키를 결합하므로, 해시 함수만 사용하는 경우보다 보안성이 더 높습니다. 또한 생년월일 등의 간단한 정보만으로는 HMAC 값을 예측하기 어렵기 때문에 안전한 메시지 검증을 제공합니다.
2. C openssl 라이브러리 활용 개발 환경 구성 이전 포스팅
아래는 리눅스 환경에서 C Openssl 라이브러리를 활용하여 개발할 수 있는 개발환경 구성 예제 포스팅입니다. 오늘 다루는 HMAC 암호화 예제를 수행하기 위해서는 반드시 아래 링크를 참고하여 개발환경을 구성해야합니다.
2023.07.28 - [C] - [C/C++] Openssl 정적 라이브러리 빌드 및 Codelite 설치, 개발 환경 구성(ubuntu, codelite)
3. C openssl hmac 관련 헤더 인클루드 예제
우선 아래와 같이 hmac관련 헤더 파일들을 인클루드합니다. stdio, stdlib는 입출력 API를 사용하기 위함입니다. HMAC 관련해서는 openssl/hmac.h를 사용합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/hmac.h>
int main() {
}
4. HMAC 암호화를 위한 비밀키 입력 예제
hmac 암호화에 사용할 사용자 비밀키를 입력하는 코드를 추가합니다. 사용자가 입력한 문자열은 곧 바이트로 표시되며 이 바이트 값이 암호화에 사용됩니다. 또한 실제 HMAC 인증코드를 생성할 메세지를 입력받습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/hmac.h>
int main() {
char message[1024];
char key[1024];
printf("Enter the message: ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0;
printf("Enter the key: ");
fgets(key, sizeof(key), stdin);
key[strcspn(key, "\n")] = 0;
}
5. SHA256 알고리즘 활용 HMAC 암호화 예제
다음으로 사용자에게 입력받은 HMAC 암호화 키와 메세지를 openssl의 HMAC라이브러리를 이용하여 암호화합니다. 이 과정에서 SHA256 알고리즘으로 해시값을 생성합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/hmac.h>
int main() {
char message[1024];
char key[1024];
printf("Enter the message: ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0;
printf("Enter the key: ");
fgets(key, sizeof(key), stdin);
key[strcspn(key, "\n")] = 0;
// Calculate HMAC-SHA256
unsigned char digest[EVP_MAX_MD_SIZE];
unsigned int digest_len;
HMAC(EVP_sha256(), key, strlen(key), (unsigned char *)message, strlen(message), digest, &digest_len);
printf("HMAC: ");
for (int i = 0; i < digest_len; i++) {
printf("%02x", digest[i]);
}
printf("\n");
return 0;
}
6. 결과확인
이후 아래와 같은 HMAC 암호화 인증 코드가 생성되어 출력됩니다. 따라서 사용자의 키가 동일해야만 동일한 메세지의 같은 HMAC 코드를 얻을 수 있다는 점에서 보안성이 우수한 것을 알 수 있었습니다.