22

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

我查看了KeyStore,但它并没有真正解决我的问题。鉴于我可以提供密码,它可以存储我的密钥。然后我需要找到一个安全的地方来存储这个密码,这和我原来的问题一样。

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

更新:

我希望找到一个用于存储的 Android API,以保证只有存储了某些信息的应用程序才能将其取回。Android OS 可以根据应用程序的签名来强制执行此操作。这样我的应用程序可以在第一次运行时生成一个随机密钥并将其存储在安全存储中以备后用。有没有这方面的API?

4

3 回答 3

5

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

除了java.io.File,没有。

还是我应该寻找第三方库?

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

于 2010-07-27T00:40:57.010 回答
4

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

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

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

其中 MEID 是带有设备 ID 的字符串,“fluffy”是你最好的朋友猫的名字,“2008”是你生活中重要事件的年份。然后将这个新字符串输入一个数组,解析一个适合您的数字(例如,您获得驾照的那一天),取出三个字符并将这些字符放在字符串的末尾。从琴弦的前面剪辑到您需要的钥匙位置数,然后离开。这不应该是一个处理器密集型任务,因此,使用变量的一些容错代码,您应该能够在您的主进程中运行它,即使不太担心从系统中获得 ANR。如果您真的想变得青蛙,请在某个时候将字符串转换为位并“按位运算”更改。中提琴,低开销,

编辑:

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

我试图用这个答案提出的真正观点是,在最低限度的安全性方面,有一点先见之明。更强的安全性比我的简单回答更深入。

于 2011-02-08T05:51:57.437 回答
1

您必须在此处区分密钥和应用程序数据。

“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

于 2016-07-10T22:23:10.980 回答