Android安全存储

时间:2010-07-27 00:11:36

标签: android key-management

我想在我的Android应用程序中存储一些小而重要的信息,例如AES密钥。建议的方法是什么?我不想将密钥硬编码作为我的应用程序的一部分。

我看KeyStore但它并没有真正解决我的问题。它可以存储我的密钥,因为我可以提供密码。然后我需要找到一个安全的地方来存储这个密码,这与我原来的问题相同。

是否有内置的Android类来执行此任务?或者我应该寻找第三方图书馆?使用NDK对我来说也是可以接受的。

更新

我希望找到一个用于存储的Android API,以确保只有存储某些信息的应用程序才能检索回来。 Android OS可以基于签署应用程序的签名来强制执行此操作。这样,我的应用程序可以在第一次运行时生成随机密钥,并将其存储在安全存储中以供以后使用。这有什么API吗?

3 个答案:

答案 0 :(得分:5)

  

是否有内置的Android类   执行此任务?

除了java.io.File之外,没有。

  

或者我应该寻找第三方   库?

你可以试试,但我怀疑大多数看起来都像你已经拒绝的解决方案。大多数安全数据存储涉及密码并假设密码保存在别处(例如,在用户的头部)。例如,OI Safe有一个基于Intent的系统,允许应用程序将东西存储在保险箱中,然后用户参与解锁保险箱IIRC。

答案 1 :(得分:4)

如果最终使用KeyStore API,一种解决方案是在每次应用程序需要访问KeyStore时在运行时动态生成密码。如果您将密码算法基于一个简单但可更改的变量,该变量与特定安装相关联,例如设备MEID(或运行时获得的物理设备的其他特定ID),您可以提供锁定变得越来越困难的密钥选择。

示例:使用物理设备中的ID,切入三个位置并将它们附加到ID字符串中的结束位置,然后以编程方式将首字母附加到字符串。我认为这种方法会给一层安全性,除非破解者知道你是如何制作密钥的(即有你的源代码),否则不能轻易破解。

MEID = MEID + "fluffy" + "2008";

如果MEID是带有设备ID的字符串,“蓬松”是您最好的朋友猫的名字,“2008”是您生命中重要事件的一年。然后将这个新字符串提供给一个数组,解析一个适合你的数字(例如你获得驾驶执照的月份),抓住三个字符并将字符串放在字符串末尾。从字符串的前面剪切到您需要的键位数,然后离开。这不应该是一个非常耗费处理器的任务,因此,对于变量的一些容错代码,您应该能够在主进程中运行它,即使过分担心从系统获取ANR也是如此。如果你真的想得到蛙式,请在某个时刻将字符串转换为位,然后按位“按位”转换。 Viola,一种低开销的动态密钥,对于运行它的设备是唯一的!

修改

正如@RedWarp指出的那样,反编译.apk总是在任何具有适当工具和动机的目标代码的可能性范围内。如果“密钥”生成是一个非常重要的过程,那么在应用程序范围之外抽象密钥类是必须的。

我试图用这个答案做的真正观点是,一点点预想可以在最低安全性方面采取措施。更强的安全性比我的简单答案更深入。

答案 2 :(得分:0)

您必须在此处区分键和应用数据。

" AndroidKeyStore" KeyPairGenerator和KeyGenerator将您在应用程序中生成的密钥存储在KeyStore中的别名下,并将密钥与您的应用程序相关联。如果设备具有"安全硬件"您可以指定使用它并将密钥存储在那里。

密钥没有密码。您可以使用别名指定要使用的密钥。只有您的应用可以检索它生成的密钥。

见:https://developer.android.com/training/articles/keystore.html

对于您应用的私人数据,如果我理解" ...用于存储的Android API,以确保只有存储某些信息的应用程序才能检索回来。 ..",你可以看看这些:

https://developer.android.com/guide/topics/data/data-storage.html#filesInternal https://developer.android.com/guide/topics/data/data-storage.html#db