Java 保密密钥-在Android应用程序中。。有什么想法吗

Java 保密密钥-在Android应用程序中。。有什么想法吗,java,android,encryption,mcrypt,Java,Android,Encryption,Mcrypt,我的一个Android应用程序中有一个mcrypt加密和解密例程。这实质上是对通过获取的字符串进行解密。远程呼叫。当然,“密钥”存储在代码中,但是任何使用apktool的人都可以看到代码和我的密钥 是否有加密所有Java代码的方法,这样即使反编译也无法读取/理解 我听说过ProGuard,但从阅读来看,它似乎不足以达到这个目的。我也不是安全专家,但我知道VM编译语言可以很容易地反编译您可以尝试使用ProGuard混淆代码,但仍然可读,我建议它尝试保存它并使用,类似于或,我不希望回答您的问题,但会

我的一个Android应用程序中有一个mcrypt加密和解密例程。这实质上是对通过获取的字符串进行解密。远程呼叫。当然,“密钥”存储在代码中,但是任何使用apktool的人都可以看到代码和我的密钥

是否有加密所有Java代码的方法,这样即使反编译也无法读取/理解


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

我也不是安全专家,但我知道VM编译语言可以很容易地反编译您可以尝试使用ProGuard混淆代码,但仍然可读,我建议它尝试保存它并使用,类似于或,我不希望回答您的问题,但会给您一条从现在开始的路线。

您可以在每次需要提取字符串时生成一个新密钥

然后,您需要使用硬编码证书进行密钥交换(如果正确实现,这是安全的)


或者,如果只是为了在传输过程中确保安全,则只需使用SSL即可

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

建议:代码中会有一些文本字符串,比如“请稍候,您的请求正在处理…”找到这样一条消息,并生成一个字节数组,通过将字节数组与文本字符串XORing,将该消息更改为实际密钥

e、 g.“松鼠”异或[16 1D 10 19 1A 13 0B 18]=>“大象”


只有“squirrel”和字节数组实际出现在您的代码中。

您不应该在代码中放入密钥。编译后的代码可以很容易地进行反向工程,任何拥有调试器的人都可以钩住实际密钥的创建点。安全性始终依赖于算法,假定客户端代码是公共的,并且潜在攻击者拥有一个副本


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

问题是为什么对字符串进行加密?如果是为了传输和服务器存储安全,则使用公钥加密。如果你想对用户“隐藏”它,那么你就不走运了,因为你的应用程序可以“看到”所有东西用户也可以。字符串被加密以隐藏流式传输的文件的位置-目的是混淆,至少使临时用户/脚本小子更难独立于应用程序下载mp3。我知道你在说什么,也完全理解应用程序能看到的任何东西——任何有足够决心的人都可以调试、解密或反编译——我只是想让它变得更加困难。有决心的人仍然会经历这一切并取得成功。没什么大不了的。。基本上不要使用脚本kiddies..为什么不让客户端生成密钥对并将其公钥与请求一起发送到服务器?@Nathan好主意,在客户端创建一个随机密钥。另外:密钥可以存储在SQLite数据库中,或者以其他形式存储在应用程序私有存储中。这将阻止应用程序外部的访问-至少在非根设备上。@HannoBinder,是的,或者可以根据所需的复杂性动态生成密钥。谢谢Necronet。我在这里读了好几篇文章,但都没有一个明确的解决方案。。我会检查你链接的那些。这种方法听起来似乎是可行的。。每次生成一个新密钥是可行的,但我不熟悉使用硬编码证书的密钥交换。你能再详细说明一下或者给我指个方向吗?你好!是的,这与我最初的想法是一致的。基本上有一些例程(利用算法)可以从string.xml中的数据以及其他一些随机嵌入的变量中创建密钥。将所有这些合并到嵌入到单独类中的几个方法中。然后最后使用ProGuard,这将使跟踪特定函数/例程所做的工作变得更具挑战性。我知道即使在这种情况下,也有人能够找到它,但这需要花费更多的时间-从简单的反编译和读取,到必须跟踪代码几分钟。因此,您的建议是什么?可能会有一个配置屏幕,以便用户能够定义自己的psw。然后存储usr pasw的散列,当应用程序启动时,请求psw。如果psw散列与存储的散列相匹配,则向用户授予访问权限。您还可以向用户颁发密钥,在数据库中存储哈希值,并让他们在首次在线使用时验证其应用程序。