代码之家  ›  专栏  ›  技术社区  ›  Szere Dyeri

安卓安全存储

  •  21
  • Szere Dyeri  · 技术社区  · 14 年前

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

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

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

    更新:

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

    3 回复  |  直到 8 年前
        1
  •  5
  •   CommonsWare    14 年前

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

    以外 java.io.File 没有。

    还是找第三方 图书馆?

    你可以试一下,但我怀疑大多数人会像你已经拒绝的解决方案。大多数安全数据存储都涉及密码,并假定密码保存在其他地方(例如,在用户的头上)。例如, OI Safe 有一个基于意图的系统,允许应用程序将东西存储在保险箱中,但是用户参与了保险箱的解锁,IIRC。

        2
  •  4
  •   Kingsolmn    12 年前

    如果最终使用了keystore api,一个解决方案是在应用程序每次需要访问keystore时动态地在运行时生成密码。如果您将密码算法建立在一个简单但可更改的变量上,该变量与特定的安装绑定在一起,例如设备meid(或在运行时获得的物理设备的其他特定ID),那么您可以为锁提供一个越来越难选择的密钥。

    示例:使用来自物理设备的ID,在三个位置剪切并将其附加到ID字符串中的结束位置,然后以编程方式将您的首字母附加到字符串。我认为这种方法将提供一个不易被破坏的安全层,除非破解者知道您是如何生成密钥的(即拥有源代码)。

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

    其中meid是一个带有设备ID的字符串,“fluffy”是你最好的朋友猫的名字,“2008”是你生命中重要事件的一年。然后将这个新字符串输入一个数组,通过一个适合您的数字进行解析(例如,您获得驾驶执照的那个月的某一天),取出三个字符,并将这些字符放到字符串的末尾。从绳子的前面剪到钥匙所需的位置,然后离开。这不应该是一个处理器密集型的任务,因此,使用一些变量的容错代码,您应该能够在主进程中运行此任务,即使从系统中获取ANR的担心太多。如果您真的想得到frogy,可以在某个点将字符串转换为位,然后“按位操作”更改。Viola,一个低开销的动态键,对于运行它的设备来说是独一无二的!

    编辑:

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

    我试图用这个答案来说明的一点是,有一点先入为主的想法可以使安全性降到最低。更强的安全性比我简单的回答更深入。

        3
  •  0
  •   user1135300    8 年前

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

    “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