我刚读了这篇文章http://android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.html,在那里我学会了生成安全密钥。
我想知道如何安全地保存这个生成的密钥,以便黑客不会得到这个甚至手机根源。
如果我们保存此SharedPreference
,Storage
,那么黑客可以获得此功能。
感谢。
答案 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使用一个电话号码作为用户名创建一个用户帐户(Jabber ID:[电话号码] @s.whatsapp.net)。 在服务器端使用未知算法生成密码并发送给客户端。
但如果手机已植根,您可以轻松提取此密码,如提及here。
WhatsApp使用端到端加密,它将所有数据以加密形式存储在内部存储中。
Snapchat已声明使用 Rooted Android 设备的Snapchatters将无法登录。
你可以做的是使用WhatsApp和Snapchat等巨型应用程序的混合技术
答案 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复制到功能强大的计算机并使用暴力破解,可以轻松破坏未保存的字符串方法。