Я разрабатываю приложение, в котором хранится ключ в хранилище ключей 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));
}