首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android Keystore的使用

Android Keystore的使用
EN

Security用户
提问于 2018-03-30 12:15:16
回答 4查看 5.8K关注 0票数 10

我使用Android存储非对称密码(解密包含非对称密钥的文件)。我这么做是因为我想加密大量数据,而不对称是不够的,密钥存储库自SDK 23以来就拥有对称密钥。

  • 在传统的HSM中,您不能访问加密密钥,您只发送数据,而HSM执行加密操作。但是在Android中,您可以从Keystore检索手动操作的密钥(使用密码等)。安全吗?
  • 如果不安全,是否有可能在使用后从内存中擦除密钥?(例如,在我的函数结束时)
  • 如果它是安全的,有什么风险?内存被病毒破坏了吗?
EN

回答 4

Security用户

回答已采纳

发布于 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中,一旦应用程序内存中有什么东西,就几乎不可能清除它或将其归零。

票数 10
EN

Security用户

发布于 2018-05-30 02:26:57

其他答案涵盖了一切,但其中一个方面似乎被误解了。正如其他答案所引用的那样..。

关键材料永远不会进入申请过程。当应用程序使用Android Keystore密钥执行密码操作时,幕后的明文、密文和要签名或验证的消息被输入执行密码操作的系统进程。

这意味着Android应用程序无法通过任何受支持的方式检索密钥的任何字节。这种强制执行是可能的,因为Android (和Java)可以通过单一方法( Key.getEncoded()Key.getEncoded() )访问Key接口中的原始密钥材料。对于由Android管理的密钥,Key.getEncoded()返回null

票数 5
EN

Security用户

发布于 2018-08-07 04:15:36

如果您确实需要将密钥数据导入AndroidKeyStore (例如,您需要执行密钥存储所不支持的某些操作),那么如何确保它不保留在应用程序内存中并不是显而易见的。不过,我自己也在玩这个游戏,如果您做以下操作,您似乎是非常安全的:

  • 确保您的密钥数据仅存储在byte[]或类似的(而不是String或其他可能复制其数据的对象)中。
  • 实现您自己的*KeySpec类,它不创建数据的任何副本(默认的拷贝),并且没有直接的方法来清除复制的数据,因为它是私有的)
  • 一旦将密钥数据放在密钥存储库中,就覆盖保存密钥数据的byte[]
  • 键位:立即使用零或垃圾数据将另一个虚拟条目存储在密钥存储库中。这似乎是清除复制的唯一方法,同时将要通过RPC发送到密钥存储服务的数据进行打包。

希望这能有所帮助。

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/182619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档