Google Tink:如何从KeysetHandle获取原始密钥字符串?

时间:2018-10-08 12:20:00

标签: tink

我是Tink的新手,想从我生成的KeysetHandle中提取原始密钥数据(以String形式):

keysetHandle = KeysetHandle.generateNew(
                    AeadKeyTemplates.AES128_GCM);

或者其他一些API来获取它。

我该如何实现?

3 个答案:

答案 0 :(得分:1)

示例将有所帮助。这是您使用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);
            }
       }

答案 1 :(得分:0)

您可以使用需要加密的KeysetHandle.write()和其他CleartextKeysetHandle.write()将密钥集写入磁盘。两者都需要BinaryKeysetWriter或JsonKeysetWriter。

答案 2 :(得分:0)

您可以使用反射来获取密钥集,如下所示,或者使用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();