我使用Android存储非对称密码(解密包含非对称密钥的文件)。我这么做是因为我想加密大量数据,而不对称是不够的,密钥存储库自SDK 23以来就拥有对称密钥。
发布于 2018-05-29 18:03:05
让我们来看看Android开发人员docs “Android密钥存储系统”。根据使用KeyStore
对象的方式,我们需要对其进行细分。如果使用的是Android KeyStore KeyStore.getInstance("AndroidKeyStore")
,那么:
1)如果应用程序运行的设备具有硬件支持的安全存储,那么
关键材料可以绑定到Android设备的安全硬件(例如,可信执行环境(TEE)、安全元件(SE))。当为密钥启用此功能时,其密钥材料永远不会暴露在安全硬件之外。
“Android密钥存储系统”文章提供了关于如何使用此功能的更多信息。
2)如果设备没有硬件支持的安全存储,那么:
关键材料永远不会进入申请过程。当应用程序使用Android Keystore密钥执行密码操作时,幕后的明文、密文和要签名或验证的消息被输入执行密码操作的系统进程。
这个系统进程大概是用C编写的,在这里,它们对内存管理有更多的控制,当键超出应用程序的作用域时,可以正确地对键进行归零(这使我对垃圾收集器感到不满.)
3)如果由于某种原因使用KeyStore.getInstance("JKS")
(在示例这里中)--可能出于某种原因需要访问私钥,或者需要在.jks
文件中加载/存储私钥--则不能删除它:因为Java垃圾收集器是以将内存返回到操作系统而不清除或归零而著名。从Android开发人员文档中,我没有看到任何证据表明Dalvik垃圾收集器的工作方式有任何不同。
此外,Java垃圾收集器的机制之一是复制程序当前引用的任何堆变量,然后释放旧堆。这意味着,即使在私钥超出作用域之前,也可以将私钥副本释放回操作系统。
底线:如果恰当地使用了Android KeyStore对象,您的私钥将在可信的执行环境(TEE)、安全元素(SE)或系统进程中安全地保持。
如果出于某种原因,你把私钥带到你的应用程序中,那么所有的赌注都取消了,因为在Java / Dalvik / Android中,一旦应用程序内存中有什么东西,就几乎不可能清除它或将其归零。
发布于 2018-05-30 02:26:57
其他答案涵盖了一切,但其中一个方面似乎被误解了。正如其他答案所引用的那样..。
关键材料永远不会进入申请过程。当应用程序使用Android Keystore密钥执行密码操作时,幕后的明文、密文和要签名或验证的消息被输入执行密码操作的系统进程。
这意味着Android应用程序无法通过任何受支持的方式检索密钥的任何字节。这种强制执行是可能的,因为Android (和Java)可以通过单一方法( Key.getEncoded()
Key.getEncoded()
)访问Key
接口中的原始密钥材料。对于由Android管理的密钥,Key.getEncoded()
返回null
。
发布于 2018-08-07 04:15:36
如果您确实需要将密钥数据导入AndroidKeyStore (例如,您需要执行密钥存储所不支持的某些操作),那么如何确保它不保留在应用程序内存中并不是显而易见的。不过,我自己也在玩这个游戏,如果您做以下操作,您似乎是非常安全的:
byte[]
或类似的(而不是String
或其他可能复制其数据的对象)中。byte[]
。希望这能有所帮助。
https://security.stackexchange.com/questions/182619
复制相似问题