【问题标题】:How to protect an API key in a .NET application如何保护 .NET 应用程序中的 API 密钥
【发布时间】:2011-06-23 17:41:10
【问题描述】:

我的应用程序访问了许多 Web 服务,例如 Twitter 和 Flickr。它使用来自这些服务的 API 密钥,我想在我的二进制文件中混淆它们。 (我并不担心盗版或其他任何事情,我只需要对这些密钥保密。)

最好的方法是什么?

如果我将它们存储为 const SecureString,这是否会使它们超出内存? MSDN 描述说文本“在不再需要时从计算机内存中删除”,但不是 const 总是在内存中吗?

Dotfuscator 会在我的程序集中隐藏它吗? (假设我可以把它送到work。)

【问题讨论】:

  • 你不能。如果恶意攻击者想要您的 API 密钥,混淆您的二进制文件不会阻止他们访问它。无论如何,其他任何人都不知道如何处理密钥。
  • 我认为 SecureString 会使情况变得更糟。因为这是一个大牌子,上面写着“看看我,我很神秘”。 SecureString 可以防止诸如将密钥交换到磁盘之类的事情,但不能防止恶意使用。
  • 简单地拦截你对 twitter 的 http(s) 请求也应该是微不足道的。

标签: .net security obfuscation api-key dotfuscator


【解决方案1】:

我最近不得不处理这种情况。问题不在于确保有人无法使用十六进制编辑器轻松找到它,而是当它通过网络发送到各种 API 时。无论如何,只需运行 fiddler 并观看请求将显示密钥。一些 API 将受益于私钥/公钥,这会有所帮助。

我能想到的唯一解决方案是创建一个我自己的外部托管网络服务,充当客户端和目标 API 之间的代理。这使我可以为每个可以激活/停用的终端生成单独的密钥,并且大部分敏感数据都存储在我的远程代理应用程序中。

祝你好运!

~“别忘了喝你的阿华田”

【讨论】:

  • 您可以为您的解决方案发布一些示例代码吗?或解释更多它是如何工作的
【解决方案2】:

也许您可以要求您的用户使用他们自己的 api 密钥。 他们可以将自己注册到 api,然后在您的应用设置中引用他们的密钥

【讨论】:

  • 这对于移动应用来说是不可行的
【解决方案3】:

匿名是正确的,没有办法完全保护数据;总有人可以得到它。

但你想让它尽可能地困难。这意味着不要做容易阅读的事情:

  • 不存储在注册表项中(例如TwitterAPIKey REG_SZ
  • 不存储在文本文件(例如twitterkey.txt)或 ini 文件中
  • 不存储在应用程序的 .config 文件中
  • 不在二进制文件中存储为纯文本
  • 不在二进制文件中存储未加密的文件

这将使那些必须了解调试器和(可能)汇编代码的人离开。

您已经大大减少了攻击面。

只需遵循前三个建议,您就会顺利上路。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2021-06-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多