2011-10-31 104 views
7

我有一个在我的Android应用程序之一的mcrypt加密和解密例程。这本质上是解密一个通过获取的字符串。远程通话。当然,“秘密密钥”存储在代码中,但任何使用apktool的人都可以明显地看到代码并查看我的密钥。保持秘密密钥秘密 - 在Android应用程序..任何想法

无论如何加密所有的Java代码,以便即使反编译它将不可读/可理解吗?

我听说过ProGuard,但从阅读它看来,似乎不足以达到此目的。

+2

问题是为什么字符串被加密?如果是用于传输和服务器存储安全,那么使用公钥加密。如果你想从用户那里“隐藏”它,那么你运气不好,因为你的应用程序可以“看到”所有的用户。 –

+0

该字符串被加密以隐藏流式传输文件的位置 - 意图是混淆,并且至少使临时用户/脚本kiddies更难以独立于应用下载mp3。我知道你说的话,并且完全理解应用程序可以看到的任何东西 - 任何人都可以调试,解密或反编译 - 我只是想让它变得更加困难。有人确定将仍然经历所有这些并取得成功。没有biggie ..只是保持脚本kiddies基本上.. – SpacialWise

+2

为什么不让客户端生成密钥对并将其公钥发送到服务器与请求? –

回答

4

您不应该在代码中放置密钥。编译后的代码可以很容易地进行反向设计,任何具有调试器的人都可以挂钩到创建实际密钥的位置。安全性总是依赖于算法,假设客户端代码是公开的,并且潜在的攻击者拥有副本。

在代码中隐藏文字只是延迟了攻击者获取密钥的过程,但并未以任何方式阻止它。

+0

那么,你有什么建议? – SpacialWise

+0

可能有一个配置屏幕,以便用户能够定义它自己的psw。然后你存储usr pasw的散列,当应用启动时,请求psw。如果psw散列与存储的散列相匹配,则授予用户访问权限。您还可以向用户发放密钥,在数据库中存储哈希值,并让他们在线首次使用时验证其应用程序。 –

0

我不是安全专家,但我确实知道VM编译语言可以很容易地反编译,您可以尝试使用ProGuard混淆您的代码,但仍然可读,我会建议它尝试保存它并隐藏您的键使用Java Crypto,这类问题之前已经被问过类似Android Crypting DatabaseEncrypt Information in Android,我不期望回答你的问题,但给你一个指导路线,从现在开始。

+0

谢谢Necronet。我在这里阅读了几篇文章,没有一个明确的解决方案..我会检查你链接的。 – SpacialWise

0

可以代替生成你需要获取字符串的新钥匙,每次

,那么你就需要做一个硬编码证书的密钥交换(这是安全的,如果正确实施)

或只是如果仅在传输过程中使用SSL,请使用SSL

+1

这种方法听起来似乎合理..每次生成一个新密钥都是可行的,但我不熟悉硬编码证书的密钥交换。你能否进一步阐述或者指出我的方向?我' – SpacialWise

1

客户端计算机上的所有代码均可读取。你所能做的最好的是让它更难找到钥匙。

建议:代码中会有一些文本字符串,例如“请稍等,而您的请求正在处理......”找到这样一条消息,并生成一个字节数组,通过XORing将该消息转换为真正的密钥带有文本字符串的字节数组。

例如“松鼠”异或[16 1D 10 19 1A 13 0B 18] =>“大象”

只有“松鼠”和字节数组实际出现在你的代码中。

+0

嗨!是的,这符合我原先的想法。基本上有几个例程(利用算法)可以创建string.xml中的数据以及其他一些随机嵌入的变量。将所有这些组合成嵌入到不同类中的几种方法。然后最后使用ProGuard来追踪哪些特定功能/例程更具挑战性。 – SpacialWise

+0

我知道即使在这种情况下,仍然有人可以找出它,但它更费时 - 从简单的反编译和阅读必须追踪代码几分钟。 – SpacialWise