Шифрование данных с помощью SDK Yandex Cloud
С Key Management Service можно работать с помощью SDK Yandex Cloud. Реализация SDK есть на Java
SDK Yandex Cloud наиболее удобен для шифрования данных небольшого размера (ограничение на размер открытого текста – 32 КБ). Для шифрования данных большего объема рекомендуется использовать AWS Encryption SDK или Google Tink. Они шифруют данные по схеме envelope encryption.
Добавление зависимостей
Перед началом работы необходимо добавить зависимости.
Добавьте зависимости с помощью Apache Maven
<dependency>
<groupId>com.yandex.cloud</groupId>
<artifactId>java-sdk-services</artifactId>
<version>2.4.2</version>
</dependency>
Установите SDK:
go get github.com/yandex-cloud/go-sdk
Аутентификация
Аутентифицироваться можно с помощью:
- сервисного аккаунта, привязанного к виртуальной машине Yandex Cloud;
- произвольного сервисного аккаунта;
- аккаунта на Яндексе.
Аутентификация с сервисным аккаунтом, привязанным к виртуальной машине Yandex Cloud
Аутентифицируйтесь с сервисным аккаунтом, привязанным к ВМ:
CredentialProvider credentialProvider = Auth.computeEngineBuilder().build();
Аутентифицируйтесь с сервисным аккаунтом, привязанным к ВМ:
credentials := ycsdk.InstanceServiceAccount()
Аутентификация с произвольным сервисным аккаунтом
В key.json
должен содержаться авторизованный ключ сервисного аккаунта. Как создать авторизованный ключ читайте в разделе Создание авторизованных ключей.
Аутентифицируйтесь с произвольным сервисным аккаунтом:
CredentialProvider credentialProvider = Auth.apiKeyBuilder().fromFile(Paths.get("key.json")).build();
Аутентифицируйтесь с произвольным сервисным аккаунтом:
authorizedKey, err := iamkey.ReadFromJSONFile("key.json")
if err != nil {...}
credentials, err := ycsdk.ServiceAccountKey(authorizedKey)
if err != nil {...}
Аутентификация с аккаунтом на Яндексе
Переменная token
— это ваш OAuth-токен.
Аутентифицируйтесь с аккаунтом на Яндексе:
CredentialProvider credentialProvider = Auth.oauthTokenBuilder().build();
Аутентифицируйтесь с аккаунтом на Яндексе:
credentials := ycsdk.OAuthToken(token)
Шифрование и расшифрование данных
Используйте методы encrypt
и decrypt
для шифрования и расшифрования данных. В коде используются следующие переменные:
endpoint
–api.cloud.yandex.net:443
.keyId
– идентификатор ключа KMS.plaintext
– открытый текст (не более 32 КБ).ciphertext
– шифртекст.aad
– AAD-контекст.
SymmetricCryptoServiceBlockingStub symmetricCryptoService = ServiceFactory.builder()
.endpoint(endpoint)
.credentialProvider(credentialProvider)
.build()
.create(
SymmetricCryptoServiceBlockingStub.class,
SymmetricCryptoServiceGrpc::newBlockingStub
);
...
byte[] ciphertext = symmetricCryptoService.encrypt(SymmetricEncryptRequest.newBuilder()
.setKeyId(keyId)
.setPlaintext(ByteString.copyFrom(plaintext))
.setAadContext(ByteString.copyFrom(aad))
.build()
).getCiphertext().toByteArray();
...
byte[] plaintext = symmetricCryptoService.decrypt(SymmetricDecryptRequest.newBuilder()
.setKeyId(keyId)
.setCiphertext(ByteString.copyFrom(ciphertext))
.setAadContext(ByteString.copyFrom(aad))
.build()
).getPlaintext().toByteArray();
sdk, err := ycsdk.Build(context, ycsdk.Config{
Endpoint: endpoint,
Credentials: credentials,
})
if err != nil {...}
...
response, err := sdk.KMSCrypto().SymmetricCrypto().Encrypt(context, &kms.SymmetricEncryptRequest{
KeyId: keyId,
Plaintext: plaintext,
AadContext: aad,
})
if err != nil {...}
ciphertext := response.Ciphertext
...
response, err := sdk.KMSCrypto().SymmetricCrypto().Decrypt(context, &kms.SymmetricDecryptRequest{
KeyId: keyId,
Ciphertext: ciphertext,
AadContext: aad,
})
if err != nil {...}
plaintext := response.Plaintext