【问题标题】:Storing credentials in an encrypted file将凭据存储在加密文件中
【发布时间】:2015-07-26 19:58:26
【问题描述】:

我正在处理几个需要为第三方应用程序存储用户凭据的项目,例如 Paypal、Facebook 开发人员凭据等。我已经阅读了几本关于不同类型编码的书籍,包括 ASP.NET 、WPF、jQuery 等都有很好的例子说明如何使用自己的秘密访问上述服务,而且它们都使用了确切的短语“在实际项目中,您会将这些存储在加密文件中”。没有,但是,请举例说明如何做到这一点。
我在加密方面几乎没有(阅读:没有)经验,但根据我的理解,我需要使用某种密钥(盐?)加密用户名和密码并将它们保存在文件中。我还希望能够在我的应用程序上使用这些凭据,因此我需要将密钥(盐?)存储在我的代码中。
现在我的问题是:如何更安全将仍然是纯文本的解密密钥存储在程序代码中,而不是实际的凭据?
难道恶意用户一拿到密钥就不能解密我的密码文件吗?
--编辑--
我的意思是我需要存储我自己的凭据以登录第三方应用程序,而不是我的用户的凭据。例如,我需要向 Google 表明我的身份和/或我的应用,以便用户可以使用他们自己的 Google 帐户登录我的应用。
--编辑2-- 澄清一下,这就是我要说的。此截图来自 asp.net PayPal 教程: 这里有关于良好做法的快速指示吗?

【问题讨论】:

  • 您列出的两个第三方应用程序(Facebook 和 Paypal)明确禁止您收集凭据。您需要将用户引导至其 API 的 OAuth 登录页面,并保存他们登录时提供的令牌。
  • 我说的不是用户凭据,而是我自己的。我需要向 PayPal 表明自己的身份,这样钱才能到我手上等等。我需要很多服务,希望我登录才能使用我支付的服务。我想我的网络应用应该能够做到这一点,而无需我每次用户登录时都输入用户名。
  • @MirjalalTalishinski 滚动自己的加密(又名“默默无闻的安全”)是一个极其危险的建议。一个有足够动力的黑客破解你的算法的速度比破解一个众所周知的、经过广泛测试的加密系统的密钥要快得多。
  • @MirjalalTalishinski 我不认为你在讽刺,这绝对是可怕的建议。请阅读 security.stackexcange.com 问题Why shouldn't we roll our own?
  • @MirjalalTalishinski 这就是问题所在。你认为它是安全的,但你不知道它是安全的。编写一个无法破解的密码系统非常容易。编写一个密码系统是非常困难的,其他人每天都在做这件事,无法破解。请实际阅读我发布的链接,您将自己置于您没有意识到的风险中。

标签: c# encryption credentials storing-information


【解决方案1】:

您误解了关于存储加密密码的部分* + salt:这是在您的系统需要验证其他人的凭据时完成的。在这种情况下,存储密码哈希和盐比存储凭据(加密与否)更安全,因为攻击者无法取回密码,即使他设法同时掌握了哈希和盐。

以纯文本形式存储解密密钥绝不是一个好的选择,因为攻击者一旦获得密钥,就会获得您用户的密码。

没有很好的解决方案来保存您自己的凭据,无论是否加密。与 3-rd 方服务对话的组件应使用这些提供商的开发人员 API。例如,您可以使用 PayPal provides two sets of APIs 访问您的帐户,而无需存储您的密码。

如果您需要以加密形式存储少量机密信息,请使用注册表 API 将数据存储在您的应用程序已知的密钥中,并且运行您的服务器端组件的用户可以访问该密钥。只要黑客不破解运行您的服务的帐户的密码,这个秘密就是安全的。

* 从技术上讲,密码没有加密,它是散列的,即没有可靠的方法将转换结果恢复为原始值。

【讨论】:

    【解决方案2】:

    你的怀疑是正确的。如果用户有权访问密钥,他们就可以自行解密用户名和密码。

    你有两个选择

    1. 让获取密码变得足够困难,以至于获取密码的重言不值得努力找到它。这种方法是通过诸如代码混淆器之类的东西来完成的,我不会向刚开始的人推荐这种方法。把它做好并不容易,只需要一个人认为它“值得努力”就可以打破。

    2. 永远不要向用户提供信息。不是将用户名和密码存储在程序中,而是让您的程序调用您拥有的服务器,然后该服务器就是使用凭据发出请求的原因。这种方法更可靠,并且“牢不可破”(只要您的服务器是安全的),但成本更高,因为您现在需要保持服务器正常运行以处理整个用户群的负载。

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 2011-08-20
      • 2012-10-05
      • 2017-09-05
      • 2014-06-15
      • 1970-01-01
      • 2013-11-19
      • 2018-09-19
      • 2021-10-31
      相关资源
      最近更新 更多