Шифрование 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 – шифрование).
Шифрование JWE
JWE (JSON Web Encryption) – это стандарт шифрования контента на прикладном уровне, описанный в документе rfc7516.
Партнеры, выполняющие шифрование полезной нагрузки с помощью JWE, должны поддерживать следующие механизмы:
- расшифровка полезных нагрузок с использованием одного из нескольких ключей JWE;
- компактное представление;
- сжатие JWE (т. е. zip="DEF");
- алгоритм RSAES-PKCS1-V1_5 для управления ключами;
- алгоритм AES-CBC + HMAC-SHA2 для шифрования контента.
Закрытые ключи должны представлять собой ключи RSA со сроком действия в один год. Максимальный срок их жизни не должен превышать двух лет. Все идентификаторы закрытых ключей должны храниться на сервере партнера. Там же должны вычисляться значения подписи.
Данные в теле JSON шифруются клиентом и сервером в соответствии со спецификацией JWE. Тело POST или ответа целиком перекодируется в токен JWE с помощью функции "Компактное представление" в JWE.
Прежде чем начать разработку, обменяйтесь ключами JWE с Google. На этом этапе вы создаете пару ключей JWE – открытый и секретный, отправляете свой открытый ключ в Google и получаете открытый ключ от Google. Во время разработки вам необходимо обмениваться только ключами тестовой среды, используемыми для разработки и тестирования за пределами рабочей среды. Перед тестированием и запуском необходимо будет ещё раз обменяться рабочими версиями ключей.
Партнеры должны поддерживать механизм отправки и получения сообщений с использованием сжатия JWE (т. е. zip="DEF"). Для запросов и ответов используется асимметричное шифрование (с открытым ключом) с помощью ключей JWE, которыми взаимно обмениваются стороны. Наряду с JWE может использоваться подтверждение подписи JWS. В этом случае контент подписывается до шифрования и проверяется после него. Стандарт JWS также предусматривает использование асимметричных ключей: закрытого ключа для подписи и открытого – для проверки.