我的android应用程序具有硬编码(静态字符串常量)凭据(用户/密码),用于通过SMTP发送电子邮件。
问题是.apk中的.dex文件可以很容易地进行逆向工程,每个人都可以看到我的密码。
有没有办法如何保护这些凭据,而我仍然可以在我的课程中使用它们?
答案 0 :(得分:5)
我们可以使用“jni模块”在应用程序中保留“敏感硬编码字符串”。当我们尝试逆向工程APK文件时,我们在各个进程文件夹中获得lib文件夹和.so文件。无法解密。
答案 1 :(得分:3)
我想你可以尝试一个代码混淆器,但实际上这不会让你的密码100%安全,我不知道它与android编译器有多好。为什么不使用像Google那样的安全网络身份验证?
答案 2 :(得分:3)
您可以保存由AES进行模糊处理的字符串。
在许可验证库中,您可以找到AESObfuscator
。在LVL中,它用于混淆读取的缓存许可证信息,而不是要求Android Market查找应用程序是否已获得许可。 LVL可以作为SDK的组件下载。
答案 3 :(得分:2)
我认为在某种程度上工作的唯一方法是在服务器上托管凭证,只有您的应用程序可以通过某种类型的单独身份验证通过Web服务调用访问 - 类似于FB的散列键事项。如果它对他们有效,它应该适合我们。
答案 4 :(得分:1)
我正在研究类似的问题并遇到了这个有用的线程: http://www.dreamincode.net/forums/topic/208159-protect-plain-string-from-decompilers/
我对Android开发并不熟悉,但应该采用相同的想法。
答案 5 :(得分:0)
如果您没有办法进行网络授权,则需要在申请时加入第三方解密。
这是你可以尝试的 1)编写独立程序只创建密码哈希一次。 (此程序不应该是您的应用程序的一部分)。记下生成的哈希值。 http://www.mindrot.org/projects/jBCrypt/
// Hash a password for the first time.
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12));
2)将此密码哈希存储为APK中的字符串常量。
3)然后每次需要检查密码时,使用bcrypt与哈希密码进行比较。
// Check that an unencrypted password matches one that has
// previously been hashed
if (BCrypt.checkpw(candidate, hashed))
System.out.println("It matches");
else
System.out.println("It does not match");
jBCrypt是一个单独的java文件,它可以直接包含在您的应用程序中。它被认为是最强大的密码加密算法之一。 即使通过解密算法存在于你的APK中,试图打破这个是非常耗时的细节,可以在下面的文章中阅读。
阅读本文,了解bcrypt的详细信息和安全性 http://codahale.com/how-to-safely-store-a-password/
同样,只有在没有办法进行基于Web的身份验证时才使用此功能。
答案 6 :(得分:0)
使用某种简单的加密或密码,只有您(和您的代码)才能理解。反转字符串,将其存储为整数数组,您需要使用模数217或傻事来查找真实密码。
答案 7 :(得分:0)
您可以100%保护硬编码字符串的一种方法。 首先不要使用pro-guard使用allatori 链接:http://www.allatori.com/
其次,不要在任何变量中使用硬编码字符串,只需使用这样的字符串:
if(var=="abc"){}
"abc"
是示例硬编码字符串。
Allatori完全混淆了上面代码中使用的所有字符串。
希望它对你有所帮助。
答案 8 :(得分:0)
这样做会很有用:
1-您可以加密它们并混淆加密算法。任何加密以及混淆(在Adnroid中为progaurd)都是有用的。
2-您最好将字符串硬编码为代码中的字节数组。许多逆向工程应用程序都可以获取您的硬编码字符串列表,并猜测它们是什么。但是当它们采用字节数组形式时,它们将不可读。但是同样需要Proguard。 (它仅对RAM字符串常量搜索隐藏,并且仍然可以从.class文件中搜索)
3-如果使用C ++代码托管常量,则在硬编码之前对其进行加密并使用C ++代码对其进行解密不是一个坏主意。
这里也有一篇很棒的文章:
https://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/