고객사의 데이터를 보호하기 위해 두 가지 새로운 데이터 암호화/복호화 옵션을 제공하여, 무단 접근으로부터 데이터를 안전하게 보호하고 데이터 유출의 위험을 최소화합니다. 이 가이드는 각 옵션의 사용법과 적용 방법을 설명합니다.
1. 쿼리 스트링 암호화 (Query String Encryption)
URL의 쿼리 스트링으로 전송되는 사용자 데이터를 AES-256 방식으로 암호화합니다. 암호화에 사용되는 Key는 저희가 제공하는 API Key를 이용해서 생성합니다. 아래 예시를 통해 적용 방법을 확인할 수 있습니다.
예시:
먼저, 암호화할 데이터를 JSON 형식으로 만듭니다. (사용하지 않는 항목은 제거해도 무방합니다.)
Copy {
"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
필드에 추가합니다.
Copy 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 키를 생성합니다.
Copy var crypto = require ( 'crypto' );
var hashedKey = crypto .createHash ( 'sha256' ) .update ( APIKEY ) .digest ();
Javascript crypto-js library
Copy import CryptoJS from 'crypto-js' ;
const hashedKey = CryptoJS .SHA256 ( APIKEY );
2. 암호화 예시
아래 예시는 데이터를 AES-256 방식으로 암호화하는 방법을 보여줍니다.
Copy 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
Copy 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);
};
Copy 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 방식으로 암호화된 데이터를 복호화하는 방법을 보여줍니다.
Copy 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' );
}
Copy 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 3 months ago