Google Tink: Как получить необработанную строку ключа из KeysetHandle?
Я новичок в Tink и хотел бы извлечь исходные данные ключа (в виде строки) из KeysetHandle, который я сгенерировал следующим образом:
keysetHandle = KeysetHandle.generateNew(
AeadKeyTemplates.AES128_GCM);
Или, может быть, какой-то другой API, чтобы получить его.
Как мне этого добиться?
0 ответов
Вы можете записать Keyset на диск с помощью либо KeysetHandle.write(), для которого требуется шифрование, либо другого CleartextKeysetHandle.write(). Оба требуют BinaryKeysetWriter или JsonKeysetWriter.
Пример поможет. Вот как вы могли бы использоватьCleartextKeysetHandle.write()
для наблюдения за ключевым профилем:
Попробуйте это для отображения:
// display key [Caveat: ONLY for observation]
public void display_key_profile_for_test_observation_only(KeysetHandle keysetHandle) throws IOException, GeneralSecurityException
{
System.out.println("\nDisplay key:");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CleartextKeysetHandle.write(keysetHandle, JsonKeysetWriter.withOutputStream(outputStream));
System.out.println("\n"+ new String(outputStream.toByteArray()));
}
Поскольку это относится к классу, вам может потребоваться небольшая модификация кода. Вы видите ключевое словоthis
это означает, что фрагменты кода происходят из класса. Вот пример использования:
public void trial_usage_key_generation() throws IOException, GeneralSecurityException {
for (CIPHER_SYMMETRIC_ALGOS algo_type : CIPHER_SYMMETRIC_ALGOS.values()) {
System.out.println("Generating key for : " + algo_type);
KeysetHandle keysetHandle = this.generate_key_for_test_observation_only(algo_type);
this.display_key_profile_for_test_observation_only(keysetHandle);
}
}
Вы можете использовать отражение, чтобы получить набор ключей, как приведенный ниже код, или JsonKeysetWriter, чтобы получить строку байтов ключа base64ed (все еще необходимо десериализовать для соответствующего ключевого объекта, чтобы получить необработанные байты ключа).
KeysetHandle keysetHandle = KeysetHandle.generateNew(
AeadKeyTemplates.CHACHA20_POLY1305);
Method method = keysetHandle.getClass().getDeclaredMethod("getKeyset");
method.setAccessible(true);
Keyset keyset = (Keyset) method.invoke(keysetHandle);
ChaCha20Poly1305Key key = ChaCha20Poly1305Key.parseFrom(keyset.getKey(0).getKeyData().getValue());
byte[] keyBytes = key.getKeyValue().toByteArray();