如何在安卓系统中安全地存储秘钥?

5

我正在阅读有关存储秘钥(用于加密/解密数据)的内容,似乎没有办法实现。只能增加攻击者实现此操作的难度。

是真的吗?

目前我了解到的:

存储在共享首选项(私有模式)中 - 获取root权限的手机可以检索它。

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

使用Web服务器存储密钥看起来毫无用处,如果必须发送凭据,则恶意软件可以记录按键。

我太过多疑吗?


1
你永远不会太过多疑,但你必须与可用性达成合作伙伴关系。 - pedrofb
@pedrofb 我想是这样的... - ramires.cabral
2个回答

11

为什么不使用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仅允许应用程序生成加密秘密密钥(没有导入功能)。
密钥也可以受到保护,需要用户解锁设备和/或提供指纹。
例如,为了保护密码,可以生成一个受指纹保护的密码密钥,并使用它来加密用户凭证,这些凭证可以存储在首选项中。

我了解Keystore。这是一个很好的功能,但只适用于Marshmallow及以上版本。因此,您将应用程序限制为非常小的群体。 - ramires.cabral
Android KeyStore自Android 18(4.3 JellyBean MR2)开始提供。在Marshmallow中,可以使用指纹进行密钥使用授权。大约85%的用户至少使用此版本https://www.statista.com/statistics/271774/share-of-android-platforms-on-mobile-devices-with-android-os/。 - pedrofb
抱歉,你是对的。重新阅读 https://developer.android.com/training/articles/keystore.html 我找到了它。 - ramires.cabral
我在想......如果我的应用程序被篡改了怎么办?它是否仍然能够访问密钥库,或者会发生某种检查,例如对.apk的SHA1哈希检查? - ramires.cabral
由于攻击者没有您的签名证书,即使使用您的ID创建应用程序,也无法替换您安装的应用程序。在这种情况下,密钥库是受保护的。如果用户直接安装未签名的apk或从存储中下载被黑客攻击的版本的已签名应用程序,则可能会创建和使用新密钥。您可以通过验证签名和预期的安装程序来保护自己免受此类问题的影响。请参阅此文章https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app - pedrofb

2
您说得对。大多数安全专家会告诉您,绝对安全的系统是不存在的。正确的思考方式是,从攻击者必须使用的资源级别来考虑您的系统是否能够被攻破。
然后,您需要在数据价值和其他考虑因素(如解决方案的复杂性和其他成本)之间平衡您的安全措施。
就您提到的例子而言,假设您不担心手机的合法所有者/用户成为攻击者,您可以进行以下评估:
1. 如果攻击者获得了手机的物理控制权,则root手机是一种风险。要评估的是,数据的价值与手机丢失/被盗的可能性相比,那个拥有手机的人是否关心获取密钥并知道如何root手机。
2. 遮蔽秘密信息通常被认为是无用的。我个人认为这取决于具体情况。同样,攻击者需要root手机等。遮蔽秘密信息的问题在于只需要一个人找出您的做法并将该信息公开,即可完全失去其价值。
3. 如果您有键盘记录器,那么您还有什么安全保障呢?
您应该考虑使用“安全元素”。请参见安全Stack Exchange上的此帖子,其中包含一些有用的信息。

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