2

我想用 android Keystore KMS 对称地加密和解密。我知道谷歌云 KMS 和 AWS KMS,但我不想处理那个平台。

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

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

请参阅此链接以获取有关为 Android Keystore 生成私钥的信息。

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

4

1 回答 1

1

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

如果您想在 Android 上将 Tink 与 Android Keystore 一起使用,请查看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如果首选项文件名称为空,则使用默认首选项文件。

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

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

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

在 Android L 或更早版本上,或者当未设置主密钥 URI 时,密钥集将以明文形式存储在私有首选项中,由于 Android 框架的安全性,其他应用程序无法读取或写入。

于 2019-09-17T19:48:07.660 回答