在Android应用程序中隐藏加密密钥

时间:2011-10-18 19:56:34

标签: android encryption

我想隐藏用户在用户手机中加密输入的一些数据。据我所知,我可以使用密钥/种子值加密/解密数据,但如果我在代码中隐藏密钥值,我知道它可以以某种方式找到(例如反编译Java代码)。

你有什么建议让这个过程更难吗?

5 个答案:

答案 0 :(得分:6)

无法隐藏应用程序中的密钥,以便资源丰富的黑客无法将其拉出来。您可以尝试对密钥进行模糊处理并使其难以查找,但它始终可以执行。

请参阅:https://www.excelsior-usa.com/articles/java-obfuscators.html#examples

最佳选择是要求您的用户指定PIN或密码并将其用作加密密钥。这样,如果设备丢失或被盗,密钥仍然是安全的,它还可以防止有人反编译您的应用并获取应用程序的所有实例的加密密钥。

答案 1 :(得分:3)

Ice Cream Sandwich(Android 4.0)的新功能之一是keychain API。来自Platform Highlights page(强调我的):

  

Android 4.0使应用程序更容易管理身份验证   和安全的会议。新的钥匙串API和底层加密   存储让应用程序存储和检索私钥及其密钥   相应的证书链。 任何应用程序都可以使用钥匙串   用于安全地安装和存储用户证书和CA的API

答案 2 :(得分:2)

如果您对用户名/密码数据执行此操作,则应该结帐实施Authenticator

答案 3 :(得分:1)

由于android上没有任何安全存储(至少从2.2开始),你必须编写自己的存储。

真正安全地执行此操作的唯一方法是使用从用户提供的密码派生的密钥进行加密(PBKDF2 / RFc2898就是这样)。加密只能像你的密钥一样安全,如果你把它存储在手机上,那么有人可以找到并使用它。这允许您让用户存储密钥,而无需实际记住大型AES密钥。

可能有用于android的库。如果你想要一些如何做的基础,我写了一个可以找到here的Windows手机。

答案 4 :(得分:0)

如果加密/解密都发生在手机上,那么坚定的黑客就能破解它。您可以通过使用obfustication或(如果适合您的应用程序)将用户输入添加到加密/解密代码中来使生活更加艰难。

如果您的应用程序需要网络连接,则可能需要将某些代码卸载到在其他地方运行的服务器,以便加密数据存在于设备上,但密钥会在运行时下载。仍然没有防黑客,但它降低了被盗设备上机密数据的风险。