데이터 암호화 / 복호화 옵션 예시

고객사의 데이터를 보호하기 위해 두 가지 새로운 데이터 암호화/복호화 옵션을 제공하여, 무단 접근으로부터 데이터를 안전하게 보호하고 데이터 유출의 위험을 최소화합니다. 이 가이드는 각 옵션의 사용법과 적용 방법을 설명합니다.

1. 쿼리 스트링 암호화 (Query String Encryption)

URL의 쿼리 스트링으로 전송되는 사용자 데이터를 AES-256 방식으로 암호화합니다. 암호화에 사용되는 Key는 저희가 제공하는 API Key를 이용해서 생성합니다. 아래 예시를 통해 적용 방법을 확인할 수 있습니다.

예시: 먼저, 암호화할 데이터를 JSON 형식으로 만듭니다. (사용하지 않는 항목은 제거해도 무방합니다.)

{
    "email": "email@email.com",
    "userid": "userid",
    "cf1": "value 1",
    "cf2": "value 2",
    "cf3": "value 3",
    "blacklistCountries": false,
    "approvePeriod": false,
    "rejectPeriod": false,
    "ageLimit": false,
    "rejectDuplicateUser": true,
    "token": "token_id"
}

위의 JSON text 를 AES-256 방식으로 암호화하여 Query String의 encrypted 필드에 추가합니다.

https://form.argosidentity.com/?pid={project_Id}&encrypted={encrypted_json_text}

중요: pid, lang 쿼리 스트링 및 ‘추가 프로세스 (Injection)’ 페이지에서 사용하는 sid, action 쿼리 스트링은 암호화를 지원하지 않습니다.


2. 안전한 데이터 전송 옵션 (Secure Data Transmission Option)

이 옵션은 API 메서드(POST/SUBMISSION, GET/SUBMISSION, PUT/SUBMISSION, WEBHOOK)에서 데이터를 AES-256 및 PKI 방식으로 암호화하여 전송합니다. 암호화에 사용되는 Key는 저희가 제공하는 API Key를 이용해서 생성합니다.

적용 방법:

  • POST/SUBMISSION, GET/SUBMISSION, PUT/SUBMISSION, WEBHOOK 메서드를 호출할 때, 전송되는 데이터는 AES-256으로 암호화됩니다.

  • PKI를 통해 데이터의 무결성과 인증을 보장합니다.


(공통) 암/복호화 방식

고객사의 데이터 보안을 위해 API Key를 활용하여 AES-256 키를 생성하고, 이를 통해 데이터를 암호화 및 복호화하는 방법을 설명합니다.

암/복호화 방식 변경 안내 (2024. 8. 1)

기존에는 AES-256 암호화 모드로 CBC 를 사용했으나 ECB 모드로 변경하였고 따라서 IV(초기화 벡터)를 더 이상 사용하지 않습니다. 아래의 예제 코드를 참고해주시기 바랍니다.

1. 해시 키 생성

Project의 고유 API Key를 이용하여 AES-256 키를 생성합니다.

Node.js crypto module
var crypto = require('crypto');
var hashedKey = crypto.createHash('sha256').update(APIKEY).digest();
Javascript crypto-js library
import CryptoJS from 'crypto-js';
const hashedKey = CryptoJS.SHA256(APIKEY);

2. 암호화 예시

아래 예시는 데이터를 AES-256 방식으로 암호화하는 방법을 보여줍니다.

Node.js crypto module
var crypto = require('crypto');

/**
 * @param {string} data - Stringified JSON data
 * @param {string} apiKey - Project API key
 * @returns {string} Encrypted data
 */
function encrypt(data, apiKey) {
  var hashedKey = crypto.createHash('sha256').update(apiKey).digest();
  var cipher = crypto.createCipheriv('aes-256-ecb', hashedKey, null);
  return cipher.update(data, 'utf8', 'base64') + cipher.final('base64');
}
Javascript crypto-js library
import CryptoJS from 'crypto-js';

const encrypt = (data, apiKey) => {
  const hashedKey = CryptoJS.SHA256(apiKey);
  const encrypted = CryptoJS.AES.encrypt(data, hashedKey, {
    mode: CryptoJS.mode.ECB,
  });
  return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
};
Java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

public class Encryption {
    public static String encrypt(String data, String apiKey) throws Exception {
        // API 키를 SHA-256으로 해시
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hashedKey = digest.digest(apiKey.getBytes(StandardCharsets.UTF_8));

        // AES 암호화를 위한 키 생성
        SecretKeySpec secretKey = new SecretKeySpec(hashedKey, "AES");

        // AES/ECB/PKCS5Padding 모드로 Cipher 초기화
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // 데이터 암호화
        byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));

        // Base64 인코딩하여 결과 반환
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }
}

3. 복호화 예시

아래 예시는 AES-256 방식으로 암호화된 데이터를 복호화하는 방법을 보여줍니다.

var crypto = require('crypto');

/**
 * @param {string} encryptedData
 * @param {string} apiKey
 * @returns {string} Decrypted data
 */
function decrypt(encryptedData, apiKey) {
  var hashedKey = crypto.createHash('sha256').update(apiKey).digest();
  var decipher = crypto.createDecipheriv('aes-256-ecb', hashedKey, null);
  return decipher.update(encryptedData, 'base64', 'utf8') + decipher.final('utf8');
}
import CryptoJS from 'crypto-js';

const decrypt = (encryptedData, apiKey) => {
  const hashedKey = CryptoJS.SHA256(apiKey);
  const decrypted = CryptoJS.AES.decrypt(encryptedData, hashedKey, {
    mode: CryptoJS.mode.ECB
  });
  return decrypted.toString(CryptoJS.enc.Utf8);
};

Last updated