【问题标题】:Google Tink: How to get raw key string from a KeysetHandle?Google Tink:如何从 KeysetHandle 获取原始密钥字符串?
【发布时间】:2018-10-08 12:20:00
【问题描述】:

我是 Tink 的新手,想从 KeysetHandle 中提取原始密钥数据(字符串形式),我是这样生成的:

keysetHandle = KeysetHandle.generateNew(
                    AeadKeyTemplates.AES128_GCM);

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

我怎样才能做到这一点?

【问题讨论】:

    标签: tink


    【解决方案1】:

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

    【讨论】:

    • 我离开 Tink 发布了这个问题(我们没有太多时间进行实验)。有趣的是,Tink 如何暴露原始密钥。这把钥匙是我的财产,不是 Google 的!
    • 文档展示了如何导出密钥:github.com/google/tink/blob/master/docs/….
    • 没有公开secretKey的方法。你写入一个文件,然后读取它。如果我必须从客户端将此密钥提供给服务器怎么办?在 Android 中,它甚至更加复杂。如果我只想将密钥保存在内存中怎么办。
    • >没有公开secretKey的方法。你写入一个文件,然后读取它。如果我必须从客户端将此密钥提供给服务器怎么办?你给服务器密钥文件?
    【解决方案2】:

    示例会有所帮助。以下是使用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);
                }
           }
    

    【讨论】:

      【解决方案3】:

      您可以使用反射获取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();
      

      【讨论】:

        猜你喜欢
        • 2019-10-05
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 2021-09-01
        • 2015-12-20
        • 2021-12-19
        • 1970-01-01
        • 2019-02-02
        相关资源
        最近更新 更多