Хранить закрытый ключ в Android Keystore - PullRequest
0 голосов
/ 19 сентября 2018

Я разрабатываю приложение, в котором хранится ключ в хранилище ключей Android, но я хочу, чтобы этот ключ был стойкий к заводским настройкам .Я видел, что двоичные объекты хранилища ключей хранятся в /data/misc/keystore/user_0/10043_USRSKEY_myUartKey, поэтому я планирую вручную создать резервную копию этого двоичного объекта на выделенной флэш-памяти и восстановить его после сброса к заводским настройкам.

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

Но во время моих тестов я заметил, что:

  • восстановление этого файла 10043_USRSKEY_myUartKey вдругое устройство также позволяет этому другому устройству дешифровать зашифрованные данные.Насколько я понимаю, было невозможно извлечь ключевые материалы из хранилища ключей с аппаратной поддержкой.Могу ли я столкнуться с проблемой в моем драйвере TEE или в обработке хранилища ключей в моем тестовом приложении?

  • восстановление этого файла 10043_USRSKEY_myUartKey на том же устройстве после изменения PIN-кода не привело к дешифровкевопрос.Опять же, я понял, что пин-код был частью шифрования, поэтому я не понимаю, как я все еще могу декодировать данные, зашифрованные другим PIN-кодом.

  • Я также смог использовать этот файл длярасшифровать с другого apk с другой подписью.Таким образом, доступ к ключу, очевидно, не привязан к подписи apk, не так ли?

Вот пример кода, который я использую:

private void InitialiseKeystore() throws NoSuchProviderException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, PackageManager.NameNotFoundException, IOException, KeyStoreException, CertificateException {
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);
    ArrayList<String> aliases = Collections.list(keyStore.aliases());
    for(String s : aliases){
        Log.d("ALIAS", s);
        ((TextView)findViewById(R.id.textView)).append(String.format("Found key: %s\n", s));
        if(myAlias.equals(s)) return;
    }
    ((TextView)findViewById(R.id.textView)).append("\nKey not found");
    //keyStore.deleteEntry("myUartKey");
    final KeyGenerator keyGenerator = KeyGenerator
            .getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    ((TextView)findViewById(R.id.textView)).append("\nGENERATING KEY");
    final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(myAlias,
            KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
            .build();

    keyGenerator.init(keyGenParameterSpec);
    final SecretKey secretKey = keyGenerator.generateKey();
    ((TextView)findViewById(R.id.textView)).append("\nKEY GENERATED");
    final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte iv[] = cipher.getIV();
    Log.w("IV", Arrays.toString(iv));
    final byte textToEncrypt[] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,(byte)0x88, (byte)0x99,(byte)0xaa,(byte)0xbb,(byte)0xcc,(byte)0xdd,(byte)0xee,(byte)0xff};
    byte encryption[] = cipher.doFinal(textToEncrypt);
    //Get data directory
    PackageManager m = getPackageManager();
    String s = getPackageName();
    PackageInfo p = m.getPackageInfo(s, 0);
    s = p.applicationInfo.dataDir;
    File file = new File(s + File.separator + "myEncryptedUartKey.bin");
    file.createNewFile();
    //write the bytes in file
    if(file.exists())
    {
        OutputStream fo = new FileOutputStream(file);
        fo.write(iv);
        fo.write(encryption);
        fo.close();
        System.out.println("file created: "+file);
    }

    Log.i("ENC", Arrays.toString(encryption));
}
...