保护字符串不变以防逆向工程

我的android应用程序具有硬编码(静态字符串常量)凭据(用户/通行证),用于通过SMTP发送电子邮件。

问题是.apk中的.dex文件可以很容易地进行逆向工程,每个人都可以看到我的密码。

有没有办法如何保护这些凭据,而我仍然可以在我的课程中使用它们?

我们可以使用“jni模块”在应用程序中保留“敏感硬编码字符串”。 当我们尝试逆向工程APK文件时,我们在相应的进程文件夹中获得lib文件夹和.so文件。 哪个无法解密。

我想你可以尝试一个代码混淆器,但实际上这不会使你的密码100%安全,我不知道它与android编译器有多好。 为什么不使用像Google那样的安全网络身份validation?

您可以保存由AES混淆的字符串。

在许可validation库中,您可以findAESObfuscator 。 在LVL中,它用于混淆读取的缓存许可证信息,而不是要求Android Market查找应用程序是否已获得许可。 LVL可以作为SDK的组件下载。

  1. 哈希是不可能的,因为它不是双向的。
  2. 任何加密,如AES,DES,河豚,蚀刻都不是一个可行的解决方案,因为你必须在你的应用程序中包含解密部分,并且可以使用apktool,dex2jar和JD(java反编译器)的组合进行反编译,这是一个非常强大的反编译任何apk时的组合。
  3. 甚至代码混淆器也不会做任何事情,除非让反编译人员的生活变得更加困难,他们最终会得到它。

我认为在某种程度上工作的唯一方法是在服务器上托管凭证,只有您的应用程序可以通过某种types的单独身份validation通过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的身份validation时才使用此选项。

使用某种简单的加密或密码,只有您(和您的代码)才能理解。 反转字符串,将其存储为整数数组,您需要使用模数217或傻事来查找真实密码。

一种方法可以100%保护您硬编码的字符串。 首先不要使用pro-guard使用allatori链接: http : //www.allatori.com/

其次,不要在任何variables中使用硬编码字符串,只需使用这样的字符串:

 if(var=="abc"){} 

"abc"是示例硬编码字符串。

Allatori完全混淆了上面代码中使用的所有字符串。

希望它对你有所帮助。