HMAC-SHA256은 Hash-based Message Authentication Code (HMAC) 방식과 SHA-256 해시 알고리즘을 결합한 암호화 방식입니다. 주로 데이터 무결성과 인증을 보장하기 위해 사용되며, 예를 들어 메시지가 전송되는 동안 변경되지 않았음을 증명하는 데 유용합니다. HMAC-SHA256은 양방향 암호화가 아닌 해시 함수를 사용하므로 복호화가 불가능합니다. 대신, 동일한 키를 사용해 동일한 입력값에 대해 동일한 해시 값을 얻을 수 있습니다.
이번 포스팅에서는 HMAC-SHA256에 대한 개념 설명과 JavaScript 및 Java 에서 암호화 예제를 통해 사용 방법을 알아보겠습니다.
1. HMAC-SHA256이란?
HMAC은 비밀 키를 사용하여 메시지의 무결성을 검증하는 해시 기반 인증 코드입니다. 해시 함수(여기서는 SHA-256)를 사용하여 메시지와 키를 결합한 후 해시 값을 생성합니다. 이를 통해 데이터를 보낼 때 이 값도 함께 전송하면, 수신자가 같은 키를 사용해 동일한 해시 값을 계산하여 데이터가 변조되지 않았음을 확인할 수 있습니다.
HMAC-SHA256의 작동 원리:
- 비밀 키와 메시지를 결합하여 해시 함수(SHA-256)를 통해 해시 값을 생성.
- 동일한 비밀 키를 사용한 수신자가 데이터를 수신한 후, 동일한 과정으로 해시 값을 생성.
- 수신자가 생성한 해시 값과 송신자의 해시 값을 비교해 데이터가 변경되지 않았는지 확인.
HMAC-SHA256의 특징:
- 데이터 무결성 보장: 메시지가 전송되는 동안 변경되지 않았음을 확인할 수 있습니다.
- 인증: 키가 비밀이므로 해당 키를 모르는 사람은 올바른 해시 값을 생성할 수 없습니다.
- 복호화 불가능: 해시 함수는 단방향 암호화 알고리즘이므로, 한 번 해시된 값을 복호화할 수는 없습니다.
2. HMAC-SHA256 암호화 예제
2.1 JavaScript에서 HMAC-SHA256 사용하기
JavaScript에서 HMAC-SHA256을 구현하려면 CryptoJS 라이브러리를 사용할 수 있습니다. CryptoJS는 브라우저와 Node.js 환경에서 모두 동작합니다.
1) CryptoJS 설치
Node.js 환경에서 사용하려면 다음 명령어로 CryptoJS를 설치합니다.
npm install crypto-js
2) JavaScript HMAC-SHA256 암호화 예제
const CryptoJS = require('crypto-js');
// 암호화에 사용할 비밀 키
const secretKey = 'my-secret-key';
// 암호화할 메시지
const message = 'Hello, HMAC-SHA256';
// HMAC-SHA256 암호화
const hash = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Hex);
console.log('HMAC-SHA256 암호화된 해시 값:', hash);
위 코드에서는 메시지와 비밀 키를 결합하여 HMAC-SHA256 방식으로 해시 값을 생성합니다. 결과는 64자리의 16진수 문자열로 출력됩니다.
HMAC-SHA256을 Java로 구현하려면, Java의 javax.crypto 패키지를 사용하여 해시값을 생성할 수 있습니다. 아래는 Java에서 HMAC-SHA256을 사용해 메시지를 암호화하는 예제입니다.
1. Java HMAC-SHA256 암호화 예제
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HmacSHA256Example {
public static void main(String[] args) {
try {
// 암호화에 사용할 비밀 키
String secretKey = "my-secret-key";
// 암호화할 메시지
String message = "Hello, HMAC-SHA256";
// HMAC-SHA256 알고리즘을 위한 Mac 객체 생성
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
// 비밀 키를 Mac 객체에 설정
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
sha256_HMAC.init(secretKeySpec);
// 메시지를 HMAC-SHA256으로 암호화
byte[] hash = sha256_HMAC.doFinal(message.getBytes());
// 결과를 Base64로 인코딩하여 출력 (16진수로 출력도 가능)
String result = Base64.getEncoder().encodeToString(hash);
System.out.println("HMAC-SHA256 암호화된 해시 값: " + result);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
2. 코드 설명
- Mac.getInstance("HmacSHA256"): Mac 클래스는 암호화 해시 알고리즘을 구현하는 객체를 생성합니다. 여기서 HmacSHA256 알고리즘을 사용하기 위해 getInstance 메서드로 Mac 객체를 생성합니다.
- SecretKeySpec: 비밀 키를 바이트 배열로 변환하고, HMAC-SHA256 알고리즘에 맞는 형식으로 설정합니다.
- sha256_HMAC.doFinal(message.getBytes()): 메시지를 바이트 배열로 변환한 후 HMAC-SHA256으로 암호화합니다. 이 메서드는 암호화된 바이트 배열을 반환합니다.
- Base64.getEncoder().encodeToString(hash): 결과 값을 Base64로 인코딩하여 가독성 있게 출력합니다. (필요하다면 16진수로 변환해 출력할 수도 있습니다.)
3. 출력 예시
HMAC-SHA256 암호화된 해시 값: mAkfLl++i9pplxQ4bsuvkgtt6iGhJ93MUMHNOmwHhw0=
4. 16진수로 출력하기
Base64 대신 16진수로 출력하고 싶다면, 아래와 같이 바이트 배열을 16진수로 변환하는 유틸리티 메서드를 사용할 수 있습니다.
16진수로 변환하는 코드 추가:
public static String bytesToHex(byte[] hash) {
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
16진수 출력 예제:
String hexResult = bytesToHex(hash);
System.out.println("HMAC-SHA256 암호화된 해시 값 (Hex): " + hexResult);
5. 16진수 출력 예시:
HMAC-SHA256 암호화된 해시 값 (Hex): 98091f2e5fbe8bda699714386ecbaf920b6dea21a127ddcc50c1cd39ac07870d
이처럼 Java에서 HMAC-SHA256을 사용하여 데이터를 암호화하고, 이를 Base64 또는 16진수로 변환하여 출력할 수 있습니다.
'Develop' 카테고리의 다른 글
[JavaScript] URL 인코딩과 디코딩 쉽고 간단하게 적용 (6) | 2024.10.17 |
---|---|
[jQuery] 드래그 금지, 우클릭 금지, 전체 선택 금지 - 간단 방법 (7) | 2024.10.16 |
[JavaScript] 변수선언 var, let, const 스코프의 종류 그리고 클로저(Closure)의 개념 (9) | 2024.10.16 |
[JavaScript] 현재 웹페이지의 URL을 가져오는 방법 (5) | 2024.10.12 |
[PostgreSQL] 오브젝트 안에서 로그 찍기 - RAISE 사용해서 출력 (7) | 2024.10.11 |