Как управлять хранилищем ключей Android KMS для симметричного шифрования и дешифрования?

Я хочу шифровать и расшифровывать симметрично с помощью Android Keystore KMS. Я знаю об облаке Google KMS и AWS KMS, но я не хочу иметь дело с этой платформой.

Как управлять этим сгенерированным закрытым ключом Android Keystore для обеих сторон (клиент, сервер)?

Я создал закрытый ключ для шифрования и дешифрования, но мне трудно управлять хранилищем и делиться этим ключом. Я сохранил этот закрытый ключ в Private SharedPreferences для повторного использования, но есть одна проблема: этот частный SharedPreferences не защищен, потому что все могут наблюдать за этим частным файлом SharedPreferences на корневом устройстве.

Перейдите по этой ссылке, чтобы получить информацию о создании частного ключ для хранилища ключей Android.

Я новичок в tink, поэтому, пожалуйста, помогите мне с этим. если в моей идее есть что-то неправильное, не стесняйтесь высказывать свое мнение.


person Pankaj Savaliya    schedule 06.07.2019    source источник


Ответы (1)


Android Keystore — это KMS на стороне клиента, вы не можете использовать его на стороне сервера.

Если вы хотите использовать Tink с Android Keystore на Android, ознакомьтесь с AndroidKeysetManager. Вот пример:

 String masterKeyUri = "android-keystore://my_master_key_id";
 AndroidKeysetManager manager = AndroidKeysetManager.Builder()
    .withSharedPref(getApplicationContext(), "my_keyset_name", "my_pref_file_name")
    .withKeyTemplate(SignatureKeyTemplates.ECDSA_P256)
    .withMasterKeyUri(masterKeyUri)
    .build();
 PublicKeySign signer = PublicKeySignFactory.getPrimitive(manager.getKeysetHandle());

При этом будет прочитан набор ключей, хранящийся в my_keyset_name файле настроек my_pref_file_name. Если имя файла настроек равно null, используется файл настроек по умолчанию.

Если набор ключей не найден или недействителен, а допустимый KeyTemplate установлен с помощью AndroidKeysetManager.Builder.withKeyTemplate(com.google.crypto.tink.proto.KeyTemplate), новый набор ключей создается и записывается в предпочтение my_keyset_name файла общих настроек my_pref_file_name.

На Android M или новее, если для URI главного ключа задано значение AndroidKeysetManager.Builder.withMasterKeyUri(java.lang.String), набор ключей шифруется с помощью главного ключа, сгенерированного и сохраненного в хранилище ключей Android. Когда Tink не может расшифровать набор ключей, он предполагает, что он не зашифрован.

URI главного ключа должен начинаться с android-keystore://. Если мастер-ключ не существует, создается новый. Использование хранилища ключей Android можно отключить с помощью AndroidKeysetManager.Builder.doNotUseKeystore().

В Android L или более ранней версии или когда URI главного ключа не установлен, набор ключей будет храниться в открытом виде в личных настройках, которые благодаря безопасности платформы Android не могут читать или записывать никакие другие приложения.

person Thai Duong    schedule 17.09.2019
comment
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы ваш коллега пользователи будут иметь некоторое представление о том, что это такое и почему оно там, а затем процитируйте наиболее важную часть страницы, на которую вы ссылаетесь, в случае, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены. - person Alessio; 17.09.2019
comment
Спасибо за чаевые. Я отредактировал свой ответ, чтобы добавить больше информации. - person Thai Duong; 19.09.2019