1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-Tink

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
JAVA-HOWTO.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 23:35 dc96e85

Tink для Java: инструкция

Этот документ содержит инструкции и фрагменты кода на Java для выполнения типичных задач в Tink (https://github.com/tink-crypto/tink-java).

Инструкции по настройке

См. https://developers.google.com/tink/tink-setup#java для получения инструкций по настройке.

Документация API

Важные предупреждения

Не используйте API, поля или методы которых помечены аннотацией @Alpha. Они могут быть изменены любым образом или даже удалены в любое время. Они находятся в пакете, но не предназначены для официального выпуска продукции, а только для тестирования.

Не используйте API в com.google.crypto.tink.subtle. Хотя они обычно безопасны в использовании, они не предназначены для публичного использования и могут быть изменены любым способом или даже удалены в любой момент.

Инициализация Tink

Tink предоставляет настраиваемую инициализацию, которая позволяет выбирать конкретные реализации (идентифицированные типами ключей) желаемых примитивов. Эта инициализация происходит через регистрацию реализаций.

Например, если вы хотите использовать все реализации всех примитивов в Tink, инициализация будет выглядеть следующим образом:

import com.google.crypto.tink.config.TinkConfig;

TinkConfig.register();

Чтобы использовать только реализации примитива AEAD:

import com.google.crypto.tink.aead.AeadConfig;

AeadConfig.register();

Для пользовательской инициализации регистрация осуществляется непосредственно через класс Registry:

import com.google.crypto.tink.Registry;
import my.custom.package.aead.MyAeadKeyManager;

// Зарегистрировать пользовательскую реализацию AEAD.
Registry.registerKeyManager(new MyAeadKeyManager());

Генерация новых ключей и наборов ключей

Каждая реализация KeyManager предоставляет методы newKey(..), которые генерируют новые ключи соответствующего типа ключа. Однако, чтобы избежать случайной утечки конфиденциального ключевого материала, следует избегать смешивания генерации ключей с использованием ключей в коде. Чтобы поддержать разделение между этими действиями, Tink предоставляет инструмент командной строки под названием Tinkey (TINKEY.md), который можно использовать для общих задач управления ключами.

Тем не менее, если необходимо сгенерировать KeysetHandle со свежим ключевым материалом непосредственно в Java-коде, можно использовать KeysetHandle (https://github.com/tink-crypto/tink-java/blob/main/src/main/java/com/google/crypto/tink/KeysetHandle.java). Например, вы можете создать набор ключей, содержащий случайно сгенерированный ключ AES128-GCM следующим образом.

import com.google.crypto.tink.KeysetHandle;
import com.google.crypto.tink.aead.PredefinedAeadParameters;

KeysetHandle keysetHandle = KeysetHandle.generateNew(
    PredefinedAeadParameters.AES128_GCM);

Сериализация наборов ключей

После создания ключевого материала может потребоваться его сериализовать, чтобы сохранить его в системе хранения, например, записать в файл.

import com.google.crypto.tink.InsecureSecretKeyAccess;
import com.google.crypto.tink.KeysetHandle;
import com.google.crypto.tink.TinkJsonProtoKeysetFormat;
import com.google.crypto.tink.aead.PredefinedAeadParameters;

// Создать ключевой материал...
KeysetHandle keysetHandle = KeysetHandle.generateNew(
    PredefinedAeadParameters.AES128_GCM);

// и сериализовать его в строку.
String keysetFilename = "my_keyset.json";
String serializedKeyset =
    TinkJsonProtoKeysetFormat.serializeKeyset(handle, InsecureSecretKeyAccess.get());

Разбор можно выполнить с помощью TinkJsonProtoKeysetFormat.parseKeyset. Если у набора ключей нет секретного ключевого материала, можно использовать метод serializeKeysetWithoutSecret (который не требует InsecureSecretKeyAccess).

Хранение наборов ключей без шифрования на диске не рекомендуется. Tink поддерживает шифрование наборов ключей с помощью мастер-ключей, хранящихся в удалённом управлении ключами. ## Ротация ключей

В Tink ротация ключей обеспечивается с помощью класса KeysetHandle.Builder.

Необходимо предоставить объект KeysetHandle, который содержит набор ключей, подлежащих ротации, и спецификацию нового ключа через объект Parameters.

    import com.google.crypto.tink.KeysetHandle;
    import com.google.crypto.tink.KeysetManager;

    KeysetHandle keysetHandle = ...;   // существующий набор ключей
    KeysetHandle.Builder builder = KeysetHandle.newBuilder(keysetHandle);
    builder.addEntry(KeysetHandle.generateEntryFromParameters(
      ChaCha20Poly1305Parameters.create()).withRandomId());
    KeysetHandle keysetHandleWithAdditionalEntry = builder.build();

После успешной ротации полученный набор ключей содержит новый ключ, сгенерированный в соответствии со спецификацией в объекте параметров. Для успешной ротации реестр должен содержать менеджер ключей для типа ключа, указанного в keyTemplate.

Кроме того, вы можете использовать Tinkey для ротации или управления набором ключей.

Пользовательская реализация примитива

ПРИМЕЧАНИЕ: Использование пользовательских менеджеров ключей должно осуществляться ответственно. Мы (то есть разработчики Tink) не можем проверить или обеспечить соблюдение требований безопасности соответствующего интерфейса примитивов, поэтому ответственность за обеспечение необходимых свойств лежит на разработчике и пользователе пользовательской реализации.

Основные криптографические операции, предлагаемые Tink, доступны через так называемые примитивы, которые представляют собой интерфейсы, представляющие соответствующие криптографические функции. Хотя Tink поставляется с несколькими стандартными реализациями общих примитивов, он также позволяет добавлять пользовательские реализации примитивов. Такие реализации позволяют легко интегрировать Tink с пользовательскими сторонними криптографическими схемами или аппаратными модулями, а в сочетании с функциями ротации ключей (#ротация ключей) обеспечивают безболезненную миграцию между криптографическими схемами.

Чтобы создать пользовательскую реализацию примитива, выполните следующие действия:

  1. Определите, для какого примитива требуется пользовательская реализация.
  2. Определите протокольные буферы, содержащие ключевой материал и параметры для пользовательской криптографической схемы; имя ключевого протокольного буфера (также известного как тип URL) определяет тип ключа для пользовательской реализации.
  3. Реализуйте интерфейс KeyManager для примитива из шага №1 и типа ключа из шага №2.

Для использования пользовательской реализации примитива в приложении зарегистрируйте в Registry пользовательский KeyManager (из шага №3 выше) для пользовательского типа ключа (из шага №2 выше):

    Registry.registerKeyManager(keyManager);

После этого реализация будет автоматически доступна для keysetHandle.getPrimitive, соответствующего примитиву (когда используются ключи определённого типа ключа). Его также можно получить напрямую через Registry.getKeyManager(keyType).

При определении протокольных буферов для ключевого материала и параметров (шаг №2 выше) необходимо предоставить определения трёх сообщений:

  • ...Params: параметры экземпляра примитива, необходимые при использовании ключа.
  • ...Key: фактический ключ proto, содержащий ключевой материал и соответствующий ...Params proto.
  • ...KeyFormat: параметры, необходимые для генерации нового ключа. ...Ключ должен содержать поле версии (монотонно возрастающий счётчик, uint32 version;), которое идентифицирует версию реализации, способную работать с этим ключом.

...Параметры должны быть полем ...Ключа, поскольку по определению ...Параметры содержат параметры, необходимые при использовании ключа.

...Параметры также должны быть полем ...Формата ключа, чтобы для данного ...Формата ключа была вся информация, необходимая для создания нового сообщения ...Ключ.

В качестве альтернативы, в зависимости от требований варианта использования, вы можете полностью пропустить шаг № 2 и повторно использовать существующие сообщения протокола буфера для ключевого материала. В таком случае вам не следует настраивать Реестр через класс Config, а лучше зарегистрировать нужные экземпляры KeyManager вручную.

Рассмотрим конкретный пример: предположим, что нам нужна пользовательская реализация примитива Aead (шаг №1). Затем мы определяем три сообщения протокола буфера (шаг №2):

  • MyCustomAeadParams: содержит параметры, необходимые для использования ключевого материала.
  • MyCustomAeadKey: содержит фактический ключевой материал и параметры, необходимые для его использования.
  • MyCustomAeadKeyFormat: содержит параметры, необходимые для генерации нового ключа MyCustomAeadKey.
syntax = "proto3";
package mycompany.mypackage;

message MyCustomAeadParams {
  uint32 iv_size = 1; // размер вектора инициализации в байтах
}

message MyCustomAeadKeyFormat {
  MyCustomAeadParams params = 1;
  uint32 key_size = 2; // размер ключа в байтах
}

// key_type: type.googleapis.com/mycompany.mypackage.MyCustomAeadKey
message MyCustomAeadKey {
    uint32 version = 1;
    MyCustomAeadParams params = 2;
    bytes key_value = 3; // фактический ключевой материал
}

Соответствующий тип ключа на Java определяется как

String keyType = "type.googleapis.com/mycompany.mypackage.MyCustomAeadKey";`

и соответствующий менеджер ключей реализует (шаг №3) интерфейс KeyManager

class MyCustomAeadKeyManager implements KeyManager<Aead> {
  // ...
}

После регистрации MyCustomAeadKeyManager в реестре он будет использоваться при вызове keysetHandle.getPrimitive(Aead.class).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-Tink.git
git@api.gitlife.ru:oschina-mirror/mirrors-Tink.git
oschina-mirror
mirrors-Tink
mirrors-Tink
master