我在我的项目中使用 Google/Tink 的确定性对称密钥加密。像这样-
byte[] ciphertext;
Context context = getApplicationContext();
String plainText="Hello World";
try {
DeterministicAeadConfig.register();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
try {
KeysetHandle keysetHandle = KeysetHandle.generateNew(
KeyTemplates.get("AES256_SIV"));
Log.d("TAG",keysetHandle.toString());
DeterministicAead daead =
keysetHandle.getPrimitive(DeterministicAead.class);
ciphertext = daead.encryptDeterministically(plainText.getBytes(),null);
String c= new String(Base64.getEncoder().encodeToString(ciphertext));
Log.d("TAG",c);
MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
Log.d("TAG",mainKey.toString());
String filePath = Environment.getExternalStorageDirectory() + "/my_keyset.json";
String masterKeyUri = "android-keystore://_androidx_security_master_key_";
keysetHandle.write(JsonKeysetWriter.withFile(new File(filePath)),
new AndroidKeystoreKmsClient().getAead(masterKeyUri));
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
}
一切正常。现在,如果用户重置手机或发生任何其他事故(其他原因),我正在为 Android keyStore 创建哪个主密钥,可以删除/丢失。然后 Tink 的 keyset(key) 将无法使用。有没有办法保留主密钥的备份或从用户输入或任何其他解决方案创建主密钥?
注意:AWS KMS 或 GCP KMS 不是我的解决方案。作为密码学的新手,任何建议/建议将不胜感激。