# Security

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

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

별도로 전달해 드린 샘플 코드(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 를 사용하는 점이 다릅니다.

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

암호화된 요청( 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 를 검증합니다.

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