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 라이브러리 구성
페이로드 전송
- 서명할 때는
SHA384
를 다이제스트 알고리즘으로 사용해야 합니다.SHA1
또는MD5
를 사용하지 마세요. - 암호화할 때는
AES256
을 대칭 암호화 알고리즘으로 사용해야 합니다.CAST5
또는IDEA
를 사용하지 마세요. - 메시지를 암호화하거나 서명할 때 용도에 맞는 하위 키를 선택해야 합니다. 서명에는
CAN_SIGN
키를, 암호화에는ENCRYPT_COMMS
/ENCRYPT_STORAGE
키를 사용하세요.
페이로드 수신
- 페이로드를 확인할 때 라이브러리에서
SHA384
와 같은 최신 해시 알고리즘을 지원하는지 확인하세요. Google은 2023년 5월 14일부터 모든 새 키에 이 알고리즘을 사용합니다. - 페이로드를 복호화할 때 라이브러리가
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는 또한 비대칭 키(서명에는 비공개 키, 확인을 위해서는 공개 키)를 사용합니다.