Google Tink: как получить необработанную строку ключа из KeysetHandle?

Я новичок в Tink и хотел бы извлечь необработанные данные ключа (в форме строки) из KeysetHandle, которые я сгенерировал следующим образом:

keysetHandle = KeysetHandle.generateNew(
                    AeadKeyTemplates.AES128_GCM);

Или, может быть, какой-то другой API, чтобы получить его.

Как я могу этого добиться?


person Manish Kumar Sharma    schedule 08.10.2018    source источник


Ответы (3)


Вы можете записать набор ключей на диск либо с помощью KeysetHandle.write(), который требует шифрования, либо с помощью CleartextKeysetHandle.write(). Оба требуют BinaryKeysetWriter или JsonKeysetWriter.

person Thai Duong    schedule 17.01.2019
comment
Я покинул Tink, чтобы опубликовать эту проблему (у нас не было много времени для экспериментов). Забавно, однако, как Tink раскрывает необработанный ключ. Этот ключ является МОЕЙ собственностью, а не Google! - person Manish Kumar Sharma; 18.01.2019
comment
В документации показано, как экспортировать ключи: github. com/google/tink/blob/master/docs/. - person Thai Duong; 19.01.2019
comment
Не существует метода, раскрывающего секретный ключ. Вы пишете в файл, а затем читаете его. что, если я должен передать этот ключ серверу от клиента? В Android все еще сложнее. Что делать, если я хочу сохранить секретный ключ только в памяти. - person MrDumb; 12.06.2019
comment
›Не существует метода, раскрывающего секретный ключ. Вы пишете в файл, а затем читаете его. что, если я должен передать этот ключ серверу от клиента? Вы даете серверу ключевой файл? - person Thai Duong; 13.06.2019

Пример поможет. Вот как вы могли бы использовать 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);
            }
       }
person Ursa Major    schedule 21.06.2019

Вы можете использовать отражение, чтобы получить набор ключей в виде кода ниже, или JsonKeysetWriter, чтобы получить байтовую строку ключа base64 (все еще необходимо несериализовать соответствующий объект ключа, чтобы получить необработанные байты ключа).

        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();
person V.E.O    schedule 11.09.2019