Android凭证存储: Where to save private keys?

标签 android security

我的应用程序包含我想要加密的安全内容。我想在本地存储 key (主要是因为我的用户不使用任何身份验证机制进行登录)。

这些是我从Android上找到的解决方案

  • Android Keystore System :这听起来像是完美的解决方案,它显着提高了本地存储 key 的安全性,但它只提供 APIS 18+ 的加密协议(protocol),而我的应用程序需要支持 API 14。
  • KeyChain API :它主要有助于在应用程序之间共享安全 key ,它还需要用户参与选择证书链。
  • 来自 Android Security and Design , 如何保存安卓公钥:

    To keep your public key safe from malicious users and hackers, do not embed it in any code as a literal string. Instead, construct the string at runtime from pieces or use bit manipulation (for example, XOR with some other string) to hide the actual key. The key itself is not secret information, but you do not want to make it easy for a hacker or malicious user to replace the public key with another key.

    虽然这听起来是个不错的提示,但实际上并没有增加多少安全性。

那么在不要求用户身份验证的情况下保存私钥的最佳做法是什么?

最佳答案

查看安全 API key 存储的这五个最佳实践,避免暴露 key 带来的麻烦:

<强>1。不要将 API key 直接存储在代码中。

将您的 API key 嵌入您的源代码中似乎是一个实用的想法,但它存在安全风险,因为您的源代码最终可能会出现在许多屏幕上。相反,将您的 API key 和 secret 直接存储在您的环境变量中。环境变量是动态对象,其值在应用程序外部设置。这将使您可以轻松访问它们(例如,通过使用 Python 中的 os.getenv() 方法,或在 Node 应用程序中使用 dotenv 包),并避免在推送代码时意外暴露 key 。

<强>2。不要将您的 API key 存储在客户端。

如果您正在开发网络应用程序,请记住始终将您的凭据始终存储在后端。从那里获取 API 结果,然后将它们传递给前端。 如果您是一名移动开发人员,那么将您的凭据存储在您的应用程序之外就显得尤为重要,因为经验丰富的用户可以轻松地对您的应用程序进行预留工程并找到您的凭据。尝试将您的 API 凭据存储在您拥有的单独服务器上,并使用同一台服务器获取 API 结果,然后再将它们传递给客户端。

<强>3。不要在代码存储库中公开未加密的凭据,即使是私有(private)的也是如此

我们都喜欢帮助社区和在线共享代码,但很容易忘记您在代码中的凭据并让它们暴露在世人面前。存储库经常被克隆并 fork 到新项目中,使新开发人员能够访问其完整历史记录。存储库历史记录中的任何凭据都将存在于从该源生成的所有新存储库中。
即使是私有(private)存储库也可能使您容易受到黑客攻击,因此您应该将暴露在任何公共(public)或私有(private)存储库中的任何 API key 视为已泄露。相反,通过使用 gitignorefile 指定 Git 忽略的文件或只记得在发布前散列您的凭据,在发布之前删除您的 API key 和 secret 。

<强>4。考虑使用 API secret 管理服务

将您的 API 凭据存储为环境变量将为您省去很多麻烦,但如果您正在与一个大团队一起处理一个项目,您可能会发现很难让每个人保持同步。为了方便和安心,一种解决方案是使用 AWS Secret Manager 等 secret 管理服务。这不仅可以保护您的 key ,还可以帮助您检索和管理整个团队的凭据。

<强>5。如果您怀疑存在违规行为,请生成新 key

如果您认为您的 API 凭据已被泄露,请保持冷静并简单地撤销您的 key 。这可以通过以下步骤在 Amadeus for Developers 门户上轻松完成:

  1. 登录您的帐户。
  2. 访问您的自助工作区
  3. 选择有问题的应用
  4. 点击刷新按钮生成新 key 。

结论

对于安全的 API key 存储,没有一种放之四海而皆准的解决方案——您需要考虑各种因素,例如团队规模或项目范围,以找到适合您的解决方案。我们希望本文介绍的一些最佳做法能够帮助您保护您的凭据并避免以后不必要的麻烦和麻烦。

关于Android凭证存储: Where to save private keys?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33011065/

相关文章:

java - 阻止发送的短信被记录在默认消息应用程序中

android - Espresso - 点击 textview(button)

android - 将用户重定向到 iTunes 应用商店或 Google Play 商店?

c - UNIX 套接字 : Is it possible to spoof getsockopt() SO_PEERCRED?

c# - 加密 WCF 连接的其他方法

PHP设置安全问题

security - 如何确保用户只登录一次?

java - 如何设置 Android Studio 以使用原生库?

java - Spring Security - Autowiring 不工作

java - 为什么我的应用程序抛出 IllegalStateException GoogleApiClient 尚未连接?