Шифрование PGP
PGP – это стандартный набор алгоритмов шифрования, расшифровки и подписи, обеспечивающих конфиденциальность и аутентификацию.
Партнеры, выполняющие шифрование полезной нагрузки с помощью PGP, должны поддерживать следующие механизмы:
- шифрование и расшифровка полезных нагрузок с использованием нескольких ключей PGP;
- подписание полезных нагрузок с использованием нескольких ключей PGP;
- проверка полезной нагрузки с несколькими подписями, любая из которых может являться подписью с ключом, предоставленным Google;
- расшифровка полезных нагрузок, закодированных по стандарту Base64 для URL.
Открытые ключи PGP, переданные в Google, должны иметь подключ, используемый для шифрования. Подключ позволяет выполнять независимую ротацию на основе главного ключа. Главный ключ предназначен для подтверждения учетных данных. Закрытые ключи должны представлять собой ключи RSA размером 2048 бит (или больше) со сроком действия в один год. Максимальный срок их жизни не должен превышать двух лет.
Прежде чем начать разработку, обменяйтесь ключами PGP с Google. На этом этапе вы создаете пару ключей PGP – открытый и секретный, отправляете свой открытый ключ в Google и получаете открытый ключ от Google. Во время разработки вам необходимо обмениваться только ключами тестовой среды, используемыми для разработки и тестирования за пределами рабочей среды. Перед тестированием и запуском необходимо будет ещё раз обменяться рабочими версиями ключей.
Создание нового ключа PGP
Используйте следующую команду POSIX, чтобы создать новую пару ключей (системный путь должен указывать на исполняемый файл GPG).
$ gpg --full-generate-key
Когда появится запрос, выберите ключ RSA. Его размер должен составлять не менее 2048 бит энтропии, а срок действия – от одного до двух лет. Будут созданы главный ключ с ярлыком SC (Signing Certificate – сертификат подписи) и подключ с ярлыком E (Encryption – шифрование).
Настройка библиотеки PGP
Отправка полезной нагрузки
- При подписании используйте в качестве алгоритм дайджеста
SHA384
, а неSHA1
илиMD5
. - Во время шифрования следует использовать в качестве алгоритма симметричного шифрования
AES256
, а неCAST5
илиIDEA
. - При шифровании или подписании сообщений выбирайте подключ с соответствующим предназначением. Используйте ключ
CAN_SIGN
для подписания и ключENCRYPT_COMMS
/ENCRYPT_STORAGE
для шифрования.
Получение полезной нагрузки
- При подтверждении полезной нагрузки убедитесь, что ваша библиотека поддерживает современные алгоритмы хеширования, например
SHA384
. Google начнет использовать его со всеми новыми кодами начиная с 14 мая 2023 г. - При расшифровке полезной нагрузки убедитесь, что ваша библиотека поддерживает современные симметричные алгоритмы шифрования, например
AES256
. Google начнет использовать его со всеми новыми кодами начиная с 14 мая 2023 г.
Пример шифрования полезной нагрузки GPG
Команда ниже – пример того, как обеспечить надежность при использовании GPG. Ожидается, что операция будет выполняться в надежной среде, где у пользователей нет доступа к закрытым ключам или конфиденциальным входным файлам.
gpg --output signed-and-encrypted.pgp \
--sign --digest-algo SHA384 \
--encrypt --cipher-algo AES256 \
--armor \
--recipient {key_id} \
input.txt
GPG будет автоматически выбирать правильный ключ из набора для каждой операции, которую вы попросите его выполнить.
Шифрование JWE
JWE (JSON Web Encryption) – это стандарт шифрования контента на прикладном уровне, описанный в документе rfc7516.
Партнеры, выполняющие шифрование полезной нагрузки с помощью JWE, должны поддерживать следующие механизмы:
- расшифровка полезных нагрузок с использованием одного из нескольких ключей JWE;
- компактное представление;
- сжатие JWE (т. е. zip="DEF");
- алгоритмы RSA-OAEP/RSA-OAEP-256 или ECDH-ES для управления ключами;
- использование алгоритма RSAES-PKCS1-V1_5 не приветствуется, но допускается;
- алгоритм A256GCM для шифрования контента.
Закрытые ключи должны представлять собой ключи RSA/ECDH-ES со сроком действия в один год. Максимальный срок их жизни не должен превышать двух лет. Все идентификаторы закрытых ключей должны храниться на сервере партнера. Там же должны вычисляться значения подписи.
Данные в теле JSON шифруются клиентом и сервером в соответствии со спецификацией JWE. Тело POST или ответа целиком перекодируется в токен JWE с помощью функции "Компактное представление" в JWE.
Прежде чем начать разработку, обменяйтесь ключами JWE с Google. На этом этапе вы создаете пару ключей JWE – открытый и секретный, отправляете свой открытый ключ в Google и получаете открытый ключ от Google. Во время разработки вам необходимо обмениваться только ключами тестовой среды, используемыми для разработки и тестирования за пределами рабочей среды. Перед тестированием и запуском необходимо будет ещё раз обменяться рабочими версиями ключей.
Партнеры должны поддерживать механизм отправки и получения сообщений с использованием сжатия JWE (т. е. zip="DEF"). Для запросов и ответов используется асимметричное шифрование (с открытым ключом) с помощью ключей JWE, которыми взаимно обмениваются стороны. Наряду с JWE может использоваться подтверждение подписи JWS. В этом случае контент подписывается до шифрования и проверяется после него. Стандарт JWS также предусматривает использование асимметричных ключей: закрытого ключа для подписи и открытого – для проверки.