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

时间:2011-09-15 18:57:04

标签: java android security reverse-engineering credentials

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

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

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

9 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

您可以保存由AES进行模糊处理的字符串。

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

答案 3 :(得分:2)

  1. 哈希是不可能的,因为它不是双向的。
  2. 任何加密,如AES,DES,blowfish,etch都不是一个可行的解决方案,因为你必须在你的应用程序中包含解密部分,并且可以使用apktool,dex2jar和JD(java反编译器)的组合进行反编译。一个非常强大的组合,同时反编译任何apk。
  3. 即使代码混淆器也不会做任何事情,除非让反编译人员的生活变得更加困难,反正他们最终会得到它。
  4. 我认为在某种程度上工作的唯一方法是在服务器上托管凭证,只有您的应用程序可以通过某种类型的单独身份验证通过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/