암호화 방법

코드 Travel Rule에 필수적인 암호화 방법에 대해 설명합니다.

CODE는 요청을 보내는 VASP 와 응답하는 VASP 사이의 구간에서 HTTPS 통신을 하는 것으로 기본적인 보안 통신을 합니다. 하지만 거래 정보나 개인 정보 같은 중요한 정보들은 payload 객체로 묶어서 다시 한번 암호화함으로써 통신하는 VASP 끼리만 볼 수 있게 합니다. (종단 간 암호화는 타 솔루션과 연동할 때에도 기본 적용됩니다.)

암호화 알고리즘 라이브러리

종단 간 암호화를 위하여 Networking and Cryptography library를 이용합니다. 사용하는 라이브러리로 libsodium 를 사용합니다.

libsodiumPublic-key cryptography - Authenticated encryption 방식을 사용합니다. Public Key 인증 암호화를 사용하여, 상대방의 Public Key를 이용해 상대방만 복호화 할 수 있는 메세지를 암호화 할 수 있습니다. 또한, 상대방의 Public Key와 보내는 측의 Public Key, Private KeyShared Secret Key를 생성할 수 있습니다. 받는 측 또한, 같은 방식으로 Shared Secret Key를 생성하여 해당 메세지가 변조되지 않았는지 복호화 하기 전에 확인이 가능합니다.

사용하는 알고리즘은 아래와 같습니다.

CODE Protocol에서는 키 페어에 대해 아래와 같이 정의 하고 있습니다.

  • Signing Key :Ed25519 알고리즘을 사용하여 디지털 서명을 생성하는 개인 키입니다. 코드에서는 이것을 Private Key로 사용합니다.
  • Verify Key :Ed25519 Signing Key의 공개 키 짝으로, 디지털 서명을 생성하는 데 사용됩니다. 코드에서는 이것을 Public Key로 사용합니다.

키페어 생성

키 페어 생성은 두가지 방법으로 하실 수 있습니다.

  1. 대시보드에서 생성
    대시보드에 로그인 하여 환경 정보 관리에서 키를 생성 하실 수 있습니다.
  2. 제공해드린 샘플코드에서 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": ...} 부분을 암호화합니다.

  1. 전송 측 VASP A는 수신측 VASP B의 Public Key와 자신(VASP A)의 Private Key 를 사용하여 암호화 합니다.
  2. 암호화한 결과를 base64로 인코딩해서 payload 값을 덮어 씁니다.
  3. 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 언어로 작성한 샘플 코드를 제공하고 있습니다. 지원 채널을 통해서 문의해 주세요.