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

Client Side Push Provisioning 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는 개발자가 실행하도록 요청한 각 작업에 대해 올바른 키를 번들에서 자동으로 선택합니다.

JWE 암호화

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

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

  • 여러 JWE 키 중 하나에서 페이로드 복호화
  • 압축 직렬화
  • JWE 압축(즉, zip='DEF')
  • 키 관리를 위한 RSA-OAEP/RSA-OAEP-256 또는 ECDH-ES 알고리즘
    • RSAES-PKCS1-V1_5는 권장되지 않지만 사용 가능
  • 콘텐츠 암호화를 위한 A256GCM 알고리즘

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

클라이언트와 서버는 JSON 웹 암호화(JWE) 사양에 따라 JSON 본문을 암호화합니다. POST 또는 응답의 전체 본문은 JWE의 '압축 직렬화' 옵션을 사용하는 JWE 토큰입니다.

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

파트너는 JWE 압축(예: zip='DEF')을 사용하여 메시지 주고받기를 지원해야 합니다. 요청 및 응답은 상호 교환한 JWE 키를 사용하여 비대칭(공개 키) 암호화를 사용하여 암호화됩니다. 또한 암호화 전에 콘텐츠를 서명하고 복호화 후에 확인하는 JWE와 함께 JWS 서명 인증을 사용할 수 있습니다. JWS는 또한 비대칭 키(서명에는 비공개 키, 확인을 위해서는 공개 키)를 사용합니다.