1. 목적
구글 앱스 스크립트에서는 RSA 암호화를 제공하지 않습니다. (현 시점에서 라이브러리도 구할 수가 없습니다.)
하지만 API를 연동하다보면 RSA 암호화가 필요한 때가 있습니다. 앱스 스크립트에서 제공하지 않는 기능을 어떻게 구현할 수 있을까요?
php, node.js 등의 언어에서 RSA 암호화를 제공하는 것을 활용할 수 있습니다.
이번 포스트에서는 php를 활용해서 RSA 암호화를 진행하는 방법을 살펴봅니다.
2. php 코드
앱스 스크립트에서 RSA 암호화를 수행해주는 php 파일을 POST로 호출하고, 암호화된 값을 받아서 활용합니다.
php 코드는 다음과 같습니다.
<?php
// POST 요청으로부터 데이터를 받아옵니다.
$postData = json_decode(file_get_contents('php://input'), true);
// 받아온 데이터에서 publicKey와 dataToEncrypt를 추출합니다.
$publicKey = $postData['publicKey'];
$dataToEncrypt = $postData['dataToEncrypt'];
// 데이터 암호화
openssl_public_encrypt($dataToEncrypt, $encryptedData, $publicKey);
// 암호화된 데이터를 base64로 인코딩합니다.
$base64EncodedData = base64_encode($encryptedData);
echo $base64EncodedData
?>
PHP
복사
코드는 아주 간결합니다. php 자체에서 openssl_public_encrypt 이라는 RSA 암호화 방식을 제공하기 때문에 이를 활용합니다.
POST로 받은 json 에서 퍼블릭키와 암호화할 데이터를 파싱해서 openssl_public_encrypt에 넘겨줍니다.
매개변수의 순서를 유의해야 합니다. 다음의 순서를 따라주세요.
1.
암호화할 데이터
2.
암호화된 데이터: 값을 전달하지 않아도 알아서 초기화하고 변수에 값을 할당해줍니다.
3.
퍼블릭키
코드에서는 마지막에 base64로 인코딩한 결과를 리턴하도록 되어 있습니다.
이제 php 파일을 rsa.php 와 같이 파일명을 지정해서 서버에 FTP를 통해서 업로드해줍니다.
간단한 php 서버 설정 방법은 다음의 포스트를 참고하실 수 있습니다.
3. 앱스 스크립트 코드
이제 php 파일을 호출할 앱스 스크립트 코드를 작성합니다.
일반적으로 패스워드를 RSA로 암호화하기 때문에 매개변수는 PASSWORD로 해주었습니다. 필요에 따라 다른 것으로 변경하실 수 있습니다.
코드는 POST로 url 을 호출하고, 호출이 성공하면 응답값을 리턴합니다.
function encryptRSA(PUBLIC_KEY, PASSWORD) {
Logger.log(`===== RSA 암호화 시작`)
const url = 'http://서버IP/rsa.php'
const payload = {
publicKey: PUBLIC_KEY,
dataToEncrypt: PASSWORD
}
const options = {
method: 'POST',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
}
try {
const response = UrlFetchApp.fetch(url, options)
const resCode = response.getResponseCode()
const resBody = response.getContentText()
if (resCode == 200) {
Logger.log(`Fetch 성공: ${resBody}`)
return resBody
} else {
Logger.log(`Fetch 오류 발생: ${resCode}`);
throw new Error('Fetch 오류 발생')
}
} catch (e) {
Logger.log(`오류 발생: ${e.stack}`)
} finally {
Logger.log(`===== RSA 암호화 종료`)
}
}
PHP
복사
이렇게 반환하는 암호화된 데이터(e.g. 패스워드)를 인증에 사용하실 수 있습니다.
4. 활용처
RSA로 패스워드를 암호화하는 방식을 어디에서 활용할까요?
예를 들면, (주)헥토데이터의 codef API 서비스를 활용할 때 사용합니다.
codef API 에서는 은행이나 카드사 API를 제공하는데, 인증을 하기 위해서 커넥티드 아이디를 생성해야 합니다.
이 과정에서 패스워드를 RSA로 암호화할 필요성이 있습니다.
codef API 개발가이드에서 Java, Python, Ruby, Node.js 샘플을 제공하고 있어서 해당 언어로 개발하는 경우에는 쉽게 참조할 수 있습니다.
하지만 앱스 스크립트로 구현하려면 라이브러리가 없어서 어려운데, 본 포스트에서 구현하는 것처럼 php 서버를 활용해서 구현할 수 있습니다.