【发布时间】:2018-10-08 12:20:00
【问题描述】:
我是 Tink 的新手,想从 KeysetHandle 中提取原始密钥数据(字符串形式),我是这样生成的:
keysetHandle = KeysetHandle.generateNew(
AeadKeyTemplates.AES128_GCM);
或者也许其他一些 API 来获取它。
我怎样才能做到这一点?
【问题讨论】:
标签: tink
我是 Tink 的新手,想从 KeysetHandle 中提取原始密钥数据(字符串形式),我是这样生成的:
keysetHandle = KeysetHandle.generateNew(
AeadKeyTemplates.AES128_GCM);
或者也许其他一些 API 来获取它。
我怎样才能做到这一点?
【问题讨论】:
标签: tink
您可以使用需要加密的 KeysetHandle.write() 或其他 CleartextKeysetHandle.write() 将 Keyset 写入磁盘。两者都需要 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 表示代码 sn-ps 来自一个类。下面是测试用法:
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);
}
}
【讨论】:
您可以使用反射获取keyset,如下代码,或JsonKeysetWriter 获取base64ed key bytestring(仍然需要反序列化为相应的key object 来获取原始key bytes)。
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();
【讨论】: