保护string常数免于逆向工程

我有Android应用程序硬编码(静态string常量)凭据(用户/传递)通过SMTP发送电子邮件。

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

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

Solutions Collecting From Web of "保护string常数免于逆向工程"

我们可以使用“jni模块”在应用程序中保留“敏感硬编码string”。 当我们尝试反向工程APK文件时,我们在相应的进程文件夹中获得lib文件夹和.so文件。 不能解密。

我想你可以尝试一个代码混淆器,但真的不会让你的密码100%安全,我不知道它跟随android编译器如何。 为什么不使用像Google这样的安全的Webauthentication?

您可以保存由AES模糊处理的string。

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

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

我认为在一定程度上工作的唯一方法是将证书托pipe在服务器上,只有您的应用程序可以通过Web服务调用通过单独的某种身份validation来访问证书 – 类似于FB的哈希键。 如果它适合他们,它应该为我们工作。

我正在调查类似的问题,并遇到这个有用的线程: http : //www.dreamincode.net/forums/topic/208159-protect-plain-string-from-decompilers/

我对Android开发并不太熟悉,但应该适用相同的想法。

如果您没有办法进行networking授权,则需要在应用程序中包含第三方解密。

这是你可以尝试1)写一个独立的程序只创build一次密码哈希。 (这个程序不应该是你的应用程序的一部分)。 记下生成的散列。 http://www.mindrot.org/projects/jBCrypt/

  // Hash a password for the first time. String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12)); 

2)将此密码哈希存储为APK中的string常量。

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文件,它可以直接包含在你的应用程序中。 它被认为是密码最强大的encryptionalgorithm之一。 即使通过解密algorithm出现在你的APK中,试图打破这是非常耗时的细节,可以在下面的文章中阅读。

阅读这篇文章的细节和bcrypt的安全性。
http://codahale.com/how-to-safely-store-a-password/

同样,只有在您没有办法进行基于Web的authentication的情况下才可以使用它。

只使用一些简单的encryption或密码,只有你(和你的代码)能理解。 反转string,将其存储为整数数组,在那里你需要采取217的MOD或愚蠢的东西来find真正的密码。

一种方法可以100%保证硬编码string的安全。 首先不要使用保护使用allatori链接: http : //www.allatori.com/

其次,不要把你的硬编码string放在任何variables中,就像这样使用这个string:

 if(var=="abc"){} 

"abc"是硬编码string的例子。

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

希望它会帮助你。