在运行时加密/解密信息

时间:2012-02-28 02:27:22

标签: android encryption cryptography

我非常坚持这一点。我的应用程序中有一个用户名和密码作为用于Javamail的字符串;但是,我当然不希望将这些内容保留为纯文本,并冒着让我的应用程序反编译和梳理的风险。

有些人建议我研究非对称加密(可能使用BouncyCastle);但是我仍然没有意识到这将如何完全有用。

我在密码学方面没有太多(如果有的话)经验,所以请耐心等待:如果我使用公钥/私钥对,我希望我的应用程序能够读取字符串 - 那么解密密钥将是“公钥”,但这对我来说并不合理,因为它完全违背了加密的目的。如果我将加密密钥作为“公钥”,那么我的所有应用程序都可以加密字符串 - 而不是解密它。

所以我的问题是:

  • 1)我的推理是否有缺陷?
  • 2)我如何解决这个难题?

2 个答案:

答案 0 :(得分:1)

重新提出问题,您希望应用程序能够访问您的用户无法访问的敏感信息。简短的回答:找到另一个项目,因为这个项目不会保证你的秘密。您最好的选择是提供代理服务,该服务位于您确定安全的机器上;让它保守秘密,让你的应用程序联系代理,以获取它需要做的一切。

您表达了主要关注的解压缩以发现您的秘密。可以说加密在这里是可行的(事实并非如此)。如果我戴上黑帽,我会反编译,找到在其参数中接收解密数据的API调用,并添加其他代码来输出这些数据,或者只是在这里设置一个断点。

答案 1 :(得分:1)

如果你想将它们存储在应用程序中,你最好能做的就是混淆它们。加密是这样做的一种方式,但它只会阻止随意的“黑客”。如果您将加密字符串作为资源(或类字段),为了解密它们,您将需要密钥才能在应用程序中。如果有人反编译您的应用程序,那么找到密钥也相当容易。你可以通过从代码中的不同位置动态生成密钥来使这一点变得更难,但是,如上所述,攻击者可以找到使用秘密的地方并转储已经解密的蜇。真的没有简单的方法。

您可以构建一个简单的Web服务,该服务需要使用Google帐户进行身份验证(几乎每个Android用户都在其设备上进行身份验证),并让它代表用户发送邮件(如果符合您的要求)。这样,你至少知道谁发送邮件并阻止他们,如果他们试图将其用于垃圾邮件,超过配额等。当然,他们可以相当容易地获得一个新的谷歌帐户,但如果你的服务是有目的的有针对性的你会遇到更大的问题。另一个缺点是您的应用需要访问设备帐户的权限,一些用户可能会将其视为隐私问题。