如何在android中安全地保存密钥

时间:2016-09-26 08:33:18

标签: android security

我刚读了这篇文章http://android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.html,在那里我学会了生成安全密钥。

我想知道如何安全地保存这个生成的密钥,以便黑客不会得到这个甚至手机根源。

如果我们保存此SharedPreferenceStorage,那么黑客可以获得此功能。

感谢。

5 个答案:

答案 0 :(得分:14)

这是保持对敏感数据的访问的整体问题。总有一种方法可以解密,然后加密密钥可能会泄漏。

您可以使用EncryptedPreferences以加密方式存储简单数据。

然而,只需快速浏览一下源代码,就必须在app init上传递密码。

EncryptedPreferences encryptedPreferences = new EncryptedPreferences.Builder(this).withEncryptionPassword("password").build();

如果密码是硬编码的,则是安全漏洞。这不是首选方法。

您可以使用您提供的链接并生成One-time pad

public static SecretKey generateKey() throws NoSuchAlgorithmException {
    // Generate a 256-bit key
    final int outputKeyLength = 256;

    SecureRandom secureRandom = new SecureRandom();
    // Do *not* seed secureRandom! Automatically seeded from system entropy.
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(outputKeyLength, secureRandom);
    SecretKey key = keyGenerator.generateKey();
    return key;
}

当然,考虑到理想情况,其中密钥生成函数理想地是随机的。

在第一次启动应用程序时生成此密钥,并在库中使用它,这是我之前提供的链接。

优势:每个应用程序安装的密钥都不同。这意味着如果破解者知道密码如何工作的方法,他仍然无法解密其他设备,只要他无法访问此类设备的SharedPreferences

答案 1 :(得分:2)

如果Android已植根,则无法保护任何内容,因此您最好在应用程序中查找体系结构更改。

示例:WhatsApp

安装后,WhatsApp使用一个电话号码作为用户名创建一个用户帐户(Jabber ID:[电话号码] @s.whatsapp.net)。 在服务器端使用未知算法生成密码并发送给客户端。

但如果手机已植根,您可以轻松提取此密码,如提及here

WhatsApp使用端到端加密,它将所有数据以加密形式存储在内部存储中。

示例:Snapchat

Snapchat已声明使用 Rooted Android 设备的Snapchatters将无法登录。

建议

你可以做的是使用WhatsApp和Snapchat等巨型应用程序的混合技术

  • 屏蔽已植根的手机
  • 确保输入密码" User-Specific" (每个用户拥有它自己的密钥)而不是"特定于应用程序" (在所有设备上都一样)
  • 在服务器上保存密码,并在每次启动应用程序时获取密码(验证并删除,不存储)
  • 确保所有数据均为加密形式

答案 2 :(得分:1)

如果您在应用程序中生成并使用密钥,则使用新的(API 18+)Android Keystore Provider可能会很有趣。密钥由特殊的安全服务存储,如果可用,可以使用安全硬件。

它不存储现有密钥(在别处创建),但允许您创建和使用密钥,而无需访问密钥本身。这个想法是秘密密钥永远不会离开安全服务,所以没有人可以提取它,甚至是你的应用程序(或根,如果使用安全硬件)。

它还允许您限制密钥的使用方式(例如,在用户身份验证后的固定时间内)

答案 3 :(得分:0)

Root用户有权在您的Android设备上执行任何操作。无论您在何处保存生成的密钥,以root运行的进程都可以读取它(只要它知道从哪里读取)。您可以决定在存储密钥之前加密密钥,但是您必须确定将保存加密密钥的位置(同样,如果它在手机上,root用户可以读取它)。

您可以考虑要求您的应用用户提供加密密钥,而不是将加密密钥存储在设备上。但是,即使这样,在攻击者给予足够的时间和精力的情况下,也可以获得该加密密钥。

您应该考虑应用程序的要求,最有可能的是,当设备植根时,您的应用程序不应向您的用户提供任何安全保障。毕竟,为什么生根设备会使保修失效。

答案 4 :(得分:0)

安全规则之一。不要发明自己的安全。您无法创建在任何设备上安全存储私钥的方法。刚学会生成密钥的时候。

  

我刚读过这篇文章   http://android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.html   在那里我学会了生成安全密钥。

一种已经发明的方法是让用户输入一个字符串(一些未保存在手机上的字符串)并使用该字符串进行加密。

通过将ROM复制到功能强大的计算机并使用暴力破解,可以轻松破坏未保存的字符串方法。