我想使用Android Keystore KMS对称地进行加密和解密。我知道Google Cloud KMS和AWS KMS,但我不想使用该平台。
如何为(客户端,服务器)双方管理此生成的Android Keystore私钥?
我已经创建了用于加密和解密的私钥,但是很难为商店进行管理并共享此密钥。 我已经将该私钥存储在Private SharedPreferences中以供重用,但是有一个问题是,此私密SharedPreferences不安全,因为所有人都可以在根设备中观察到此私密SharedPreferences文件。
请参阅此link,以获得有关为Android Keystore生成私钥的信息。
我是新手,所以请帮我解决这个问题。如果我的想法有误,请随时提出您的意见。
答案 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框架的安全性,其他任何应用程序都无法读取或写入。