如果可以对源代码进行反向工程,那么在Android(或Java)中进行encryption的意义何在?

Android和Java提供了一个相对容易使用的encryption非专家的encryptionAPI 。

但是由于我们知道,没有代码可以真正被保护免于逆向工程,尤其是用作种子或共享密钥的string常量,所以我想知道:在Android应用程序中encryption和解密的考验是什么?

我错过了什么吗?

试图让我的问题更清楚更具体:假设我有一个应用程序,其中代码和代码中使用某些string(即用户数据)需要保密:一种方法是将它们以encryptionforms存储在编译.apk并在运行时解密它们(使用混淆的硬编码密码)。 另一种方法是将它们以encryptionforms存储在远程服务器中,在运行时将它们(通过Internet)提取并解密(使用共享密码)。

我没有看到两者之间有太大的区别,因为两者都要求“密钥”存在于(可逆工程)代码中。

有没有解决这个问题?

如果没有解决scheme,为什么encryption呢?

Related of "如果可以对源代码进行反向工程,那么在Android(或Java)中进行encryption的意义何在?"

这不是严格的Android或Java的问题。 任何事情都可以颠倒,如果是本地代码就更难了。 而且要记住,他们甚至不必扭转它:你必须最终解密内存中的数据来操纵它。 在这一点上,攻击者只需要一个内存转储,他们会得到你的数据。 如果他们能够物理访问设备,并且正在使用软件操作数据,那么确实无法阻止它们。 解决scheme是使用专用硬件模块(HSM),防篡改或至less防篡改(如果有人用它,它会删除所有数据或至less保留事件日志)。 从智能卡到networking连接设备,这些设备都有不同的形状和尺寸,这些设备价格昂贵。 目前不适用于Android,但也许会得到类似于TPM的东西,所以您可以安全地存储您的密钥,并在硬件中执行encryption操作。

因此,请考虑您的数据需要多么秘密,并确定适当的保护级别。

你可能希望通过SSL下载它(这将保护它在运输过程中),确保你authentication服务器(所以你知道你从一个值得信赖的地方得到正确的数据) 客户端(所以你可以肯定你只是把数据给正确的人)。 您可以使用SSL客户端身份validation,它将比您(或任何不是密码专家的人)可能随附的任何自定义encryption/密钥交换scheme安全得多。

crypto API中的共享密钥并不是存储在应用程序中的东西(正如你所说的那样,这容易受到逆向工程的影响 – 虽然可能不像你期望的那样脆弱;混淆非常容易)。

想象一下,你想在你的手机上创build/读取encryption文件(为你的秘密购物清单)。

创build一个后,使用主密码保存它(该程序立即丢弃)。 然后,当你想读取它,你必须重新input你的主密码。 这就是API所指的共同秘密,而且与逆向工程完全是相切的。

您所描述的问题与为密码pipe理器问题存储主密码有点相似。

在这种情况下,提供的解决scheme是使用salt作为密码哈希 。

ateiob任何时候你在应用程序中存储主密码,你真的只是使未经授权的用户更难访问encryption的数据。

首先,我们可以同意,使用embedded在应用程序中的“主密钥”对数据进行encryption并将该数据存储在手机上对于“主密钥”进行反向devise和数据解密是开放的。

第二,我认为我们可以同意,使用强encryption,256位密钥和强密码,用密码encryption数据,然后删除密码应是合理安全的。 这两种技术都适用于移动设备上的编程。 事实上,iOS,支持两个开箱即用的需求。

 [keychainData setObject:@"password" forKey:(id)kSecValueData]; 

也许现实世界的例子可能有所帮助。

例如,如果在低内存中临时数据字段必须被持久保护,则可以使用主密码encryption,并且在用户清除临时数据字段时清除。 临时数据字段永远不会以纯文本forms存储。

所以有两个密码,一个主密码,embedded在应用程序中用于临时短期encryption和一个秘密密码,通常必须由用户input,用于长期保存的encryption数据。

最后,如果您正在encryption文件,请考虑添加另一个间接级别。 这样当前的密码被用来encryption一个用来encryption所有用户文件的随机密钥。 这允许用户在不需要解密的情况下更改密码,encryption所有的encryption文件。

攻击者被假定有一个你的代码的副本。 数据的保密性完全取决于密钥。 见Kerckhoffs的原则 。

为了保持密钥的安全,您必须将其与代码分开。 记住它。 把它放在钱包里的一张纸上。 将其存储在通常保存在安全的USB存储器中。 使用像PasswordSafe这样的程序。 有很多可能性。

当然,可以让任何攻击者通过许多层次的密钥来达到她实际需要的密钥。 PasswordSafe和类似的是一个这样的选项。 你会注意到,这样的程序给你一个select“记住你的密码”给你。