如何安全地在Android中存储密钥?

时间:2016-12-27 19:17:05

标签: android security android-ndk cryptography

我正在阅读关于存储密钥(加密/解密数据)的内容,似乎没有办法实现这一点。只能增加攻击者完成此任务的难度。

真的很喜欢吗?

到目前为止我得到了什么:

以共享首选项(私人模式)存储 - 有根电话将能够检索它。

NDK C / C ++本机代码,创建.so文件 - 难以反编译,但可以调用此.so文件并检索它。

存储密钥的网络服务器看起来没用,如果必须发送凭据,恶意软件可以记录密钥点击。

我太偏执了吗?

2 个答案:

答案 0 :(得分:8)

为什么不使用Android Keystore?它是专为此目的而设计的 https://developer.android.com/training/articles/keystore.html

  

Android Keystore系统允许您将加密密钥存储在容器中,以使从设备中提取更加困难

它比共享首选项或私有文件(如提取防止或密钥使用授权)具有相当大的优势我不考虑在服务器上存储私钥

安全功能

  

Android Keystore系统可保护密钥材料免遭未经授权的使用。首先,Android Keystore通过阻止从应用程序进程和整个Android设备中提取密钥材料来减少对Android设备之外的密钥材料的未授权使用。其次,Android KeyStore 通过让应用指定其密钥的授权使用,然后在应用程序的流程之外强制执行这些限制,来减轻Android设备上未经授权使用密钥材料

在某些具有专用硬件的设备中,它是在其上实现的。作为程序员,您可以知道密钥是受硬件保护的

这个概念类似于iOS KeyChain,但是IOS KeyChain可以存储密码,生成和导入加密密钥,Android KeyStore只允许应用程序生成加密密钥(无导入功能)

也可以保护密钥,要求用户解锁设备和/或显示指纹

例如,为了保护密码,可以生成受指纹保护的密码密钥,并使用它来加密可以存储在首选项中的用户凭据

答案 1 :(得分:1)

你是对的。大多数安全专家会告诉你,没有一个绝对安全的系统。考虑它的正确方法是攻击者必须使用的资源水平来打破你的系统。

然后,您可以在数据价值与其他考虑因素(如解决方案的复杂性和其他成本)之间平衡安全措施。

要详细说明您的示例,假设您并不担心手机的合法所有者/用户是攻击者,您可以按如下方式进行评估:

  1. 如果攻击者获得实际拥有权,则手机生根是一种风险。要评估数据的价值与手机丢失/被盗的可能性之间的差异,然后让他们关心获取密钥并知道如何根据手机进行操作。
  2. 通常认为隐藏秘密信息是无用的。我个人认为这取决于具体情况。在这里,再一次,攻击者需要根据电话等。隐藏秘密信息的问题是,只需要一个人弄清楚你做了什么,并使这些信息可用,完全失去了做这件事的价值。
  3. 如果你有一个密钥记录器,你还有什么安全保障?
  4. 您应该考虑使用"安全元素"的可能性。有关一些好的信息,请参阅安全性Stack Exchange上的this post