如何管理Android Keystore KMS进行对称加密和解密?

时间:2019-07-06 06:20:01

标签: android encryption-symmetric tink

我想使用Android Keystore KMS对称地进行加密和解密。我知道Google Cloud KMS和AWS KMS,但我不想使用该平台。

如何为(客户端,服务器)双方管理此生成的Android Keystore私钥?

我已经创建了用于加密和解密的私钥,但是很难为商店进行管理并共享此密钥。 我已经将该私钥存储在Private SharedPreferences中以供重用,但是有一个问题是,此私密SharedPreferences不安全,因为所有人都可以在根设备中观察到此私密SharedPreferences文件。

请参阅此link,以获得有关为Android Keystore生成私钥的信息。

我是新手,所以请帮我解决这个问题。如果我的想法有误,请随时提出您的意见。

1 个答案:

答案 0 :(得分:1)

Android Keystore是客户端KMS,您不能在服务器端使用它。

如果要在Android上的Android Keystore中使用Tink,请查看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,则使用默认的首选项文件。

如果未找到密钥集或密钥集无效,并且使用AndroidKeysetManager.Builder.withKeyTemplate(com.google.crypto.tink.proto.KeyTemplate)设置了有效的KeyTemplate,则会生成一个新的密钥集,并将其写入my_keyset_name共享首选项的my_pref_file_name首选项中文件。

在Android M或更高版本上,如果主密钥URI设置为AndroidKeysetManager.Builder.withMasterKeyUri(java.lang.String),则密钥集将使用生成并存储在Android Keystore中的主密钥进行加密。当Tink无法解密密钥集时,它将假定它没有被加密。

主键URI必须以android-keystore://开头。如果主密钥不存在,则会生成一个新密钥。可以通过AndroidKeysetManager.Builder.doNotUseKeystore()禁用Android Keystore的使用。

在Android L或更旧的版本上,或者未设置主密钥URI时,密钥集将以个人偏好设置以明文形式存储,由于Android框架的安全性,其他任何应用程序都无法读取或写入。