서비스
home

[GAS] php를 활용한 RSA 암호화

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 서버를 활용해서 구현할 수 있습니다.