从安卓密钥库中提取密钥

3

来自Android Keystore文档

Android Keystore系统可以保护密钥材料不被未授权使用。首先,通过防止从应用程序进程和整个Android设备中提取密钥材料,Android Keystore可以减轻外部未经授权的密钥材料使用。其次,Android KeyStore通过让应用程序指定其密钥的授权使用并在应用程序进程之外强制执行这些限制,可以减轻在Android设备上未经授权的密钥使用。

我无法完全理解它。

通过防止从应用程序进程中提取密钥材料

  • 这是什么意思?设备中的任何应用程序进程都无法从存储库中提取密钥?
  • 所以一旦密钥放入存储库中,就没有办法从存储库中获取它(如果我还想在其他地方使用它)。那么,如果我想要做到这一点,该如何实现自己的自定义密钥库,只允许我的应用程序进程提取密钥,而没有其他人。
2个回答

5
“防止提取”在您提供的文档中的上下文中意味着“防止对手提取密钥材料”。这并不意味着您自己的应用程序无法使用密钥从密钥库加密/解密数据。它确实意味着您将永远无法从Android KeyStore获取类似密钥文件的内容,将其复制到其他地方并重复使用。
此外,假设您需要在应用程序中在客户端和服务器之间发送加密消息。您天真地生成一个密钥并将文件(“密钥材料”)存储在应用程序的内部存储中。对手获得了设备的root权限。现在他们可以访问您的密钥文件并使用您的密钥。即使您为密钥使用密码,如果您的应用程序进程受到攻击,因为对手可以访问密钥材料(即密钥文件),所以仍然存在危险。
文档中谈到的优点正好与这些缺点相反。 Android Keystore的加密转换发生在应用程序进程之外(作为系统进程),并且可能绑定到安全硬件。没有任何密钥材料(如密钥文件等)暴露给对手以某种方式重复使用(例如解密消息或签署电子邮件)。
请注意,如果您希望将密钥用于多个应用程序,则可能需要使用KeyChain API而不是密钥库。

1
我想补充一点,如果您从AndroidKeyStore中检索私钥,则privateKey.getEncoded()方法将返回null。

因此,请考虑以下代码:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);

KeyStore.Entry keyStoreEntry = keyStore.getEntry(alias, null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) 
keyStoreEntry).getPrivateKey();
byte[] privateKeyData = privateKey.getEncoded();

privateKeyData将会是null。这就意味着:

"Android密钥库系统保护密钥材料免受未经授权的使用"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接