Security

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

기본 규칙은 메시지에 포함되는payload 객체는 암호화 합니다. 예외적으로 Broadcast 를 해야 하는 수취 VASP 를 지정하지 않는 '가상 자산 주소 조회' API 의 경우는 payload 를 암호화하지 않습니다.

별도로 전달해 드린 샘플 코드(generate_key.py) 를 실행해서 생성되는 키쌍의 역할은 Signature 를 생성하고 검증하는 Signing Key 와 Verify Key 입니다.

별도로 제공하는 샘플 코드에는 Signing Key 로부터 암호화 키를 생성해서 암호화를 수행하는 예제가 포함돼 있습니다.

CODE 에서는 Signing Key 로 암호화까지 할 수 있기 때문에 Signing Key 를 Private Key, VerifyKey 를 Public Key 로 같이 사용합니다.

별도로 전달해 드린 암호화 샘플 코드 중 python/generate_key.py 를 실행하면 Private Key 와 Public Key 쌍을 생성해서 화면에 출력합니다.

이 중 Private Key 는 분실하지 않게 잘 저장해서 사용해 주시고, Public Key 는 CODE 담당자에게 알려주세요. 만약, 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 를 사용하여 암호화(ECDH, Xsalsa20) 합니다.

  2. 암호화한 결과를 base64 로 인코딩해서 payload 값을 덮어 씁니다.

  3. payload 타입은 객체에서 String 으로 바뀝니다.

암호화 후 메시지는 다음과 같은 포맷이 됩니다.

payload 필드의 타입이 String 이면 base64 인코딩된 암호화 결과물이고, 객체이면 원문으로 판단하면 됩니다.

VASP B 가 복호화를 수행할 때에도 같은 방법을 사용하지만 VASP A 의 Public Key 와 VASP B 의 Private Key 를 사용하는 점이 다릅니다.

이해를 돕기 위해 Python, Java, Javascript 언어로 작성한 샘플 코드를 제공하고 있습니다. 지원 채널을 통해서 문의해 주세요.

암호화된 요청( request) 메시지 형식은 아래와 같습니다.

{
  "currency": "xrp”,
  “pyload": "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 를 검증합니다.

이해를 돕기 위해 Python, Java, Javascript 언어로 작성한 샘플 코드를 제공하고 있습니다. 지원 채널을 통해서 문의해 주세요.

Last updated