애플리케이션 레이어 암호화

Standard Payments API는 PGP 또는 JWE를 애플리케이션 레이어 암호화로 지원합니다.

PGP 암호화

PGP는 암호화 개인 정보 보호 및 인증을 제공하는 표준 암호화, 복호화, 서명 알고리즘 집합입니다.

PGP를 사용하여 페이로드를 암호화할 때 파트너는 다음을 지원해야 합니다.

  • 여러 PGP 키를 사용하여 페이로드 암호화 및 복호화
  • 여러 PGP 키로 페이로드 서명
  • 여러 서명으로 페이로드 확인. Google에서 제공하는 키를 사용한 서명도 가능합니다.
  • 웹 보안 base64로 인코딩된 페이로드 복호화

Google에 제공하는 PGP 공개 키에는 암호화에 사용되는 하위 키가 있어야 합니다. 하위 키를 사용하면 마스터 키와 독립적으로 순환할 수 있습니다. 마스터 키는 ID 확인에 사용됩니다. 비공개 키는 1년 이내에 만료되며 최대 수명이 2년인 2,048비트 (또는 그 이상) RSA 키여야 합니다.

개발을 시작하기 전에 PGP 키를 Google과 교환해야 합니다. 이 단계에서는 PGP 공개 키/비공개 키 쌍을 생성하고, Google에 공개 키를 제공하고, Google에서 공개 키를 다시 수신합니다. 개발 중에는 프로덕션 외부에서 개발 및 테스트에 사용되는 샌드박스 키만 교환하면 됩니다. 프로덕션 테스트 및 출시 전에 프로덕션 키 교환을 한 번 더 수행해야 합니다.

새 PGP 키 생성

시스템 경로에 GPG 바이너리가 있다고 가정하고 다음 POSIX 명령어를 사용하여 새 키 쌍을 만들 수 있습니다.

$ gpg --full-generate-key

메시지가 표시되면 2048비트 이상의 엔트로피와 1~2년의 만료 시간이 있는 RSA 키를 선택합니다. 이 명령어는 마스터 키 ('S'igning and 'C'ertificate generation을 의미하는 SC라는 라벨이 지정됨) 및 하위 키 ('E'ncryption을 의미하는 E라는 라벨이 지정됨)를 생성합니다.

PGP 라이브러리 구성

페이로드 전송

  1. 서명할 때는 SHA384를 다이제스트 알고리즘으로 사용해야 합니다. SHA1 또는 MD5를 사용하지 마세요.
  2. 암호화할 때는 AES256을 대칭 암호화 알고리즘으로 사용해야 합니다. CAST5 또는 IDEA를 사용하지 마세요.
  3. 메시지를 암호화하거나 서명할 때 용도에 맞는 하위 키를 선택해야 합니다. 서명에는 CAN_SIGN 키를, 암호화에는 ENCRYPT_COMMS/ENCRYPT_STORAGE 키를 사용하세요.

페이로드 수신

  1. 페이로드를 확인할 때 라이브러리에서 SHA384와 같은 최신 해시 알고리즘을 지원하는지 확인하세요. Google은 2023년 5월 14일부터 모든 새 키에 이 알고리즘을 사용합니다.
  2. 페이로드를 복호화할 때 라이브러리가 AES256과 같은 최신 대칭 암호화 알고리즘을 지원하는지 확인하세요. Google은 2023년 5월 14일부터 모든 새 키에 이 알고리즘을 사용합니다.

GPG 페이로드 암호화 예

아래 명령어는 GPG를 사용할 때 보안 옵션을 선택하는 방법의 예입니다. 사용자가 비공개 키나 민감한 입력 파일에 액세스할 수 없는 신뢰할 수 있는 환경에서 이 작업을 수행해야 합니다.

gpg --output signed-and-encrypted.pgp \
  --sign --digest-algo SHA384 \
  --encrypt --cipher-algo AES256 \
  --armor \
  --recipient {key_id} \
  input.txt

GPG는 개발자가 실행하도록 요청한 각 작업에 대해 올바른 키를 번들에서 자동으로 선택합니다.

JWS 서명으로 JWE 암호화

JSON 웹 암호화 (JWE)는 애플리케이션 수준에서 콘텐츠를 암호화하기 위해 rfc7516으로 정의된 표준입니다. JSON 웹 서명 (JWS)은 애플리케이션 수준에서 콘텐츠 서명을 위해 rfc7515로 정의된 표준입니다.

요청 및 응답은 '압축 직렬화' 옵션을 사용하여 비대칭 (공개 키) 암호화를 사용하여 암호화된 JWE 토큰입니다. JWE 토큰에는 서명된 페이로드가 JWS 토큰으로 포함됩니다. JWS는 또한 비대칭 키(서명에는 비공개 키, 확인을 위해서는 공개 키)를 사용합니다.

페이로드를 전송할 때는 먼저 페이로드에 서명한 다음 암호화합니다. 페이로드를 수신할 때는 먼저 복호화한 다음 서명을 확인합니다.

JWE를 사용할 때 파트너는 다음 옵션을 지원해야 합니다.

  • 압축 직렬화
  • 여러 JWE 키 중 하나에서 페이로드 복호화
  • 키 관리를 위한 RSA-OAEP, RSA-OAEP-256 또는 ECDH-ES 알고리즘
  • 콘텐츠 암호화를 위한 A256GCM, A128GCM, A128CBC-HS256 또는 A256CBC-HS512 알고리즘
    • enc 헤더에 채워집니다.
  • 공개 암호화 키를 식별하는 kid 헤더
  • JWE 암호화를 사용하는 메시지 페이로드는 application/jose; charset=utf-8 콘텐츠 유형을 사용해야 합니다.

JWS를 사용할 때 파트너는 다음 옵션을 지원해야 합니다.

  • 압축 직렬화
  • 여러 JWS 키 중 하나에서 페이로드 확인
  • 서명 생성을 위한 HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 또는 PS512 알고리즘
  • 비공개 서명 키를 식별하는 kid 헤더입니다.

JWE/JWS 문자열은 UTF-8 문자열로 인코딩되며 페이로드는 임의의 바이트일 수 있습니다.

비공개 키는 1년 이내에 만료되며 최대 수명이 2년인 RSA/ECDH-ES 키여야 합니다. 모든 비공개 키 ID는 항상 파트너의 서버에 있어야 하며 모든 서명 값은 파트너의 서버에서 계산되어야 합니다.

개발을 시작하기 전에 JWE 및 JWS 키를 Google과 교환해야 합니다. 키는 rfc7517에 정의된 대로 JWK 형식으로 교환해야 합니다. 이 단계에서는 공개 키/비공개 키 쌍을 생성하고, Google에 공개 키를 제공하고, Google에서 공개 키를 다시 수신합니다. 개발 중에는 프로덕션 외부에서 개발 및 테스트에 사용되는 샌드박스 키만 교환하면 됩니다. 프로덕션 테스트 및 출시 전에 프로덕션 키 교환을 한 번 더 수행해야 합니다.