繁体   English   中英

Android安全存储

[英]Android Secure Storage

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

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

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

更新:

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

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

除了java.io.File ,没有。

或者我应该寻找第三方图书馆?

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

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

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

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

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

编辑:

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

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

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

“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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM