我有Android应用程序,它具有硬编码(静态字符串常量)凭据(用户/通行证),用于通过SMTP发送电子邮件。
问题是.apk中的.dex文件可以很容易地进行逆向工程,每个人都可以看到我的密码。
有没有办法如何保护这些凭据,而我仍然可以在我的课程中使用它们?
我们可以使用“jni模块”在应用程序中保留“敏感硬编码字符串”。当我们尝试逆向工程APK文件时,我们在各个进程文件夹中获得lib文件夹和.so文件。哪个不能解密。
我想你可以尝试一个代码混淆器,但实际上这不会使你的密码100%安全,我不知道它与android编译器有多好。为什么不使用像Google那样的安全网络身份验证?
您可以保存由AES混淆的字符串。
在许可验证库中,您可以找到AESObfuscator
。在LVL中,它用于混淆读取的缓存许可证信息,而不是要求Android Market查找应用程序是否已获得许可。 LVL可以作为SDK的组件下载。
我认为在某种程度上工作的唯一方法是在服务器上托管凭证,只有您的应用程序可以通过某种类型的单独身份验证通过Web服务调用访问 - 类似于FB的散列键事项。如果它适用于它们,它应该对我们有用。
我正在研究类似的问题,并遇到了这个有用的线程:http://www.dreamincode.net/forums/topic/208159-protect-plain-string-from-decompilers/
我对Android开发并不太熟悉,但同样的想法应该适用。
如果您没有办法进行Web授权,则需要在应用程序中包含第三方解密。
这是你可以尝试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的身份验证时才使用此选项。
使用某种简单的加密或密码,只有你(和你的代码)才能理解。反转字符串,将其存储为整数数组,您需要使用模数217或傻事来查找真实密码。
一种方法可以100%保护您硬编码的字符串。首先不要使用pro-guard使用allatori链接:http://www.allatori.com/
其次不要在任何变量中带你硬编码字符串只需使用这样的字符串:
if(var=="abc"){}
"abc"
是示例硬编码字符串。
Allatori完全混淆了上面代码中使用的所有字符串。
希望它对你有所帮助。
这样做会很有用:
1-您可以对它们进行加密并对加密算法进行模糊处理。任何加密以及混淆(Adnroid中的progaurd)都是有用的。
2-你最好将你的字符串硬编码为代码中的字节数组。许多逆向工程应用程序可以获取您的硬编码字符串列表并猜测它们是什么。但是当它们是字节数组的形式时,它们是不可读的。但Proguard也是必要的。 (它只隐藏RAM字符串常量搜索,它们仍然可以从.class文件中搜索)
如果在硬编码之前加密它们并使用C ++代码解密它们,那么使用C ++代码来托管常量并不是一个坏主意。
这里还有一篇很棒的文章:
https://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/