암호화 방법
코드 Travel Rule에 필수적인 암호화 방법에 대해 설명합니다.
CODE는 요청을 보내는 VASP 와 응답하는 VASP 사이의 구간에서 HTTPS 통신을 하는 것으로 기본적인 보안 통신을 합니다. 하지만 거래 정보나 개인 정보 같은 중요한 정보들은 payload 객체로 묶어서 다시 한번 암호화함으로써 통신하는 VASP 끼리만 볼 수 있게 합니다. (종단 간 암호화는 타 솔루션과 연동할 때에도 기본 적용됩니다.)
암호화 알고리즘 라이브러리
종단 간 암호화를 위하여 Networking and Cryptography library를 이용합니다. 사용하는 라이브러리로 libsodium 를 사용합니다.
libsodium의 Public-key cryptography - Authenticated encryption 방식을 사용합니다. Public Key
인증 암호화를 사용하여, 상대방의 Public Key
를 이용해 상대방만 복호화 할 수 있는 메세지를 암호화 할 수 있습니다. 또한, 상대방의 Public Key
와 보내는 측의 Public Key
, Private Key
로 Shared Secret Key
를 생성할 수 있습니다. 받는 측 또한, 같은 방식으로 Shared Secret Key
를 생성하여 해당 메세지가 변조되지 않았는지 복호화 하기 전에 확인이 가능합니다.
사용하는 알고리즘은 아래와 같습니다.
CODE Protocol에서는 키 페어에 대해 아래와 같이 정의 하고 있습니다.
- Signing Key :Ed25519 알고리즘을 사용하여 디지털 서명을 생성하는 개인 키입니다. 코드에서는 이것을 Private Key로 사용합니다.
- Verify Key :Ed25519 Signing Key의 공개 키 짝으로, 디지털 서명을 생성하는 데 사용됩니다. 코드에서는 이것을 Public Key로 사용합니다.
키페어 생성
키 페어 생성은 두가지 방법으로 하실 수 있습니다.
- 대시보드에서 생성
대시보드에 로그인 하여환경 정보 관리
에서 키를 생성 하실 수 있습니다. - 제공해드린 샘플코드에서 Generator를 이용
별도로 전달해 드린 샘플 코드(generate_key.py
)를 실행해서 생성되는 키쌍의 역할은 Signature를 생성하고 검증하는 Signing Key 와 Verify Key입니다.
샘플 코드에는 Signing Key로부터 암호화 키를 생성해서 암호화를 수행하는 예제가 포함돼 있습니다.
CODE에서는 Signing Key로 암호화까지 할 수 있기 때문에 Signing Key를 Private Key, VerifyKey를 Public Key로 같이 사용합니다.
이 중 Private Key 는 분실하지 않게 잘 저장해서 사용해 주시고, Public Key는 대시보드의 환경 정보 관리
에 입력해주세요. 만약, Private Key를 분실하시면 키 쌍을 다시 생성해야 합니다.
암호화 방법
다음과 같은 원문 메시지를 암호화 하는 것을 가정하겠습니다.
{
"currency": "XRP",
"payload": {
"ivms101": {
"Beneficiary": {
"accountNumber": ["rHcFoo6a9qT5NHiVn1THQRhsEGcxtYCV4d:memo or tag"]
}
}
}
}
암호화의 대상은 payload 객체이며, {"ivms101": ...}
부분을 암호화합니다.
- 전송 측 VASP A는 수신측 VASP B의 Public Key와 자신(VASP A)의 Private Key 를 사용하여 암호화 합니다.
- 암호화한 결과를 base64로 인코딩해서 payload 값을 덮어 씁니다.
payload
타입은 객체에서 String 으로 바뀝니다.
암호화 후 메시지는 다음과 같은 포맷이 됩니다.
payload 필드의 타입이 String 이면 base64 인코딩된 암호화 결과물이고, 객체이면 원문으로 판단합니다.
VASP B 가 복호화를 수행할 때에도 같은 방법을 사용하지만 VASP A의 Public Key 와 VASP B의 Private Key를 사용하는 점이 다릅니다.
암호화된 요청(request) 메시지 형식은 아래와 같습니다.
{
"currency": "xrp",
"payload": "base64 encoded string"
}
Signature
CODE 서버는 요청을 보낸 VASP 가 맞는지 검사하기 위해 헤더에 특정 규칙에 따라 조합된 데이터를 Signing 한 값을 사용합니다.
Signature는 X-Code-Req-Datetime
, 호출하는 Body 문자열, X-Code-Req-Nonce
데이터를 하나의 Byte array로 만든 데이터를 송신 VASP A의 Private Key (Signing Key)로 Signing 해서 생성합니다.
이 Signature는 CODE 서버가 검증합니다.
CODE 서버는 요청을 보낸 클라이언트가 등록된 VASP 인지 확인하고, CODE 서버에 등록된 Public Key 로 Signature 를 검증합니다.
자세한 Signature 알고리즘은 Ed25529를 참고 하세요.
샘플 코드
이해를 돕기 위해 Python, Java, Javascript, Go 언어로 작성한 샘플 코드를 제공하고 있습니다. 지원 채널을 통해서 문의해 주세요.
Updated 4 months ago