Develop

[Java Javascript] HMAC-SHA256 암호화와 복호화 개념과 예제

issuemaker99 2024. 10. 16. 21:49
728x90

HMAC-SHA256은 Hash-based Message Authentication Code (HMAC) 방식과 SHA-256 해시 알고리즘을 결합한 암호화 방식입니다. 주로 데이터 무결성과 인증을 보장하기 위해 사용되며, 예를 들어 메시지가 전송되는 동안 변경되지 않았음을 증명하는 데 유용합니다. HMAC-SHA256은 양방향 암호화가 아닌 해시 함수를 사용하므로 복호화가 불가능합니다. 대신, 동일한 키를 사용해 동일한 입력값에 대해 동일한 해시 값을 얻을 수 있습니다.

이번 포스팅에서는 HMAC-SHA256에 대한 개념 설명과 JavaScript 및 Java 에서 암호화 예제를 통해 사용 방법을 알아보겠습니다.

1. HMAC-SHA256이란?

HMAC은 비밀 키를 사용하여 메시지의 무결성을 검증하는 해시 기반 인증 코드입니다. 해시 함수(여기서는 SHA-256)를 사용하여 메시지와 키를 결합한 후 해시 값을 생성합니다. 이를 통해 데이터를 보낼 때 이 값도 함께 전송하면, 수신자가 같은 키를 사용해 동일한 해시 값을 계산하여 데이터가 변조되지 않았음을 확인할 수 있습니다.

HMAC-SHA256의 작동 원리:

  1. 비밀 키와 메시지를 결합하여 해시 함수(SHA-256)를 통해 해시 값을 생성.
  2. 동일한 비밀 키를 사용한 수신자가 데이터를 수신한 후, 동일한 과정으로 해시 값을 생성.
  3. 수신자가 생성한 해시 값과 송신자의 해시 값을 비교해 데이터가 변경되지 않았는지 확인.

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. 코드 설명

  1. Mac.getInstance("HmacSHA256"): Mac 클래스는 암호화 해시 알고리즘을 구현하는 객체를 생성합니다. 여기서 HmacSHA256 알고리즘을 사용하기 위해 getInstance 메서드로 Mac 객체를 생성합니다.
  2. SecretKeySpec: 비밀 키를 바이트 배열로 변환하고, HMAC-SHA256 알고리즘에 맞는 형식으로 설정합니다.
  3. sha256_HMAC.doFinal(message.getBytes()): 메시지를 바이트 배열로 변환한 후 HMAC-SHA256으로 암호화합니다. 이 메서드는 암호화된 바이트 배열을 반환합니다.
  4. 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진수로 변환하여 출력할 수 있습니다.

LIST