【问题标题】:Storing secrets and credentials inside of an Android App在 Android 应用程序中存储机密和凭据
【发布时间】:2019-02-17 22:28:00
【问题描述】:

我正在使用 AWS Cognito,我需要在我的 android 应用程序中的某处存储一些凭证和机密,以便以后使用它们来登录/注册/注销用户。

一些来源建议将凭据存储在项目 gradle.properties 文件中。从那里,凭据将被检索为BuildConfig.FIELD_NAME。我可以 100% 确定在逆向工程时无法从 apk 中提取这些内容吗?

我正在考虑的另一种方法是使用非对称加密算法(使用公私钥)加密凭据,并在需要时在运行时对其进行解密,但同样,我需要将公钥存储在我的应用程序中的某个位置解密凭据。这不再起作用,因为可以通过反编译 apk 来提取公钥。

我已经对此进行了大量研究,但在这种情况下我没有发现任何可以帮助我的东西。几乎每篇文章都提到如何存储密码等凭据,但情况不同,因为我没有在运行时从服务器或任何地方检索我的秘密和凭据。调用 API 来获取凭据又是一件坏事。

那么,我怎样才能尽可能安全地做到这一点? 我在等你的解决方案!谢谢

编辑: 密钥库并没有真正起作用,因为我必须在将它们添加到密钥库之前从某个地方获取秘密

【问题讨论】:

  • @Killer 我不认为这是重复的,因为我需要在将秘密添加到密钥库之前将其存储在某个地方
  • 是的,我现在更清楚你的问题了。但问题集中在同一件事上。但是,接受的答案仅回答从外部服务器检索数据并在内部保存时的方面。但是问题仍然有建议,比如使用 NDK 来保存秘密数据

标签: android amazon-web-services security encryption credentials


【解决方案1】:

这实际上完全取决于您需要或希望您的应用程序有多安全,以及这些凭据有多敏感。由于无法从服务器端存储和检索它们,因此最好的办法是将它们嵌入代码中的某个位置。 APK 可以很容易地被反编译,因此您的凭据将始终以某种方式访问​​。真正的问题是您希望反转过程有多难。

从那里获取凭据作为 BuildConfig.FIELD_NAME。我可以 100% 确定在逆向工程时无法从 apk 中提取这些内容吗?

我 100% 确定它可以被找回 :)。 Java 不会加密任何字符串,它们都将作为原始文本存储在 dex 文件中,准备好进行 grep 处理。

接下来,您将使用静态密钥对代码中的密钥进行加密。一些工具会为你做到这一点,比如 DexGuard、Dasho、Dexprotector——你也可以想出自己的解决方案。This article 解释得很好。

请记住,您自己的解决方案或第三方工具提供的解决方案都可能被证明很容易逆转:请参阅 this example 了解 DexGuard。另请注意,在运行时解密时,这些凭据将在设备的 RAM 中清晰可见,从而允许调试器轻松读取它们。

您的下一个最佳选择是在本机代码中使用加密字符串:更难逆转和追踪,但仍然可行。

然后,您可以使用白盒加密技术,同样可以使用 Inside Secure 提出的第三方工具。这基本上会将加密算法和密钥混合到混淆的本机代码中,这可能会让您难以逆转和难以调试加密/解密方法。在这里,您将只在您的应用程序中包含加密的凭据,并且它们将在白盒内安全地解密。白盒通常非常安全(但并非不可能破解),但一旦解密,凭据将在设备的内存中清晰可见。这将更彻底地防止简单的反编译。

然后...如果不涉及硬件解决方案(KeyStore、嵌入式安全元件)和服务器来备份所有内容,我认为您不能走得更远。

【讨论】:

  • 一个有趣的问题和一个详细的答案以及额外的阅读材料,这太棒了!顺便说一句,第一篇文章内容丰富,强烈推荐给未来的读者!
猜你喜欢
  • 2017-07-22
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
相关资源
最近更新 更多