我正在处理一些需要为第三方应用程序存储用户凭据的项目,例如 Paypal、Facebook 开发人员凭据等。我已经阅读了几本关于不同类型编码的书籍,包括 ASP.NET、WPF、 jQuery,并且都有很好的例子来说明如何使用自己的秘密访问前面的服务,而且它们都使用了“在实际项目中你会将这些存储在加密文件中”的确切短语。但是,没有人举例说明如何这样做。
我在加密方面几乎没有(阅读:没有)经验,但根据我的理解,我需要使用某种密钥(盐?)加密用户名和密码并将它们保存在文件中。我还希望能够在我的应用程序上使用这些凭据,因此我需要将密钥(盐?)存储在我的代码中。
现在我的问题是:在程序代码中存储仍然是纯文本的解密密钥比实际凭据更安全吗?
恶意用户一拿到密钥就不能解密我的密码文件吗?
--EDIT--
我的意思是我需要存储我自己的凭据以登录第三方应用程序,而不是我的用户的凭据。例如,我需要向 Google 识别我自己和/或我的应用,以便用户可以使用他们自己的 Google 帐户登录我的应用。
--编辑2--澄清一下,这就是我要说的。此屏幕截图来自 asp.net PayPal 教程:
这里有关于良好实践的快速指示吗?
2 回答
您误解了有关存储加密密码* + salt 的部分:这是在您的系统需要验证其他人的凭据时完成的。在这种情况下,存储密码哈希和盐比存储凭据(加密与否)更安全,因为攻击者无法取回密码,即使他设法同时获得哈希和盐。
以纯文本形式存储解密密钥从来都不是一个好的选择,因为攻击者一旦获得密钥,就会获得您用户的密码。
没有很好的解决方案来保存您自己的凭据,无论是否加密。与 3-rd 方服务对话的组件应使用这些提供商的开发人员 API。例如,PayPal提供了两组 API,您可以使用它们来访问您的帐户,而无需存储您的密码。
如果您需要以加密形式存储少量机密信息,请使用注册表 API 将数据存储在您的应用程序已知的密钥中,并且运行服务器端组件的用户可以访问该密钥。这个秘密是安全的,只要黑客不破解运行您的服务的帐户的密码。
*从技术上讲,密码没有加密,它是散列的,即没有可靠的方法将转换结果恢复为原始值。
你的怀疑是正确的。如果用户有权访问密钥,他们可以自己去解密用户名和密码。
你有两个选择是
让获取密码变得足够困难,以至于获取密码的重言不值得努力找到它。这种方法是通过诸如代码混淆器之类的东西来完成的,我不会向刚开始的人推荐这种方法。把它做好并不容易,只需要一个人认为它“值得努力”就可以打破它。
永远不要向用户提供信息。不要将用户名和密码存储在程序中,而是让您的程序调用您拥有的服务器,然后该服务器就是使用凭据发出请求的原因。这种方法更可靠,并且“牢不可破”(只要您的服务器是安全的),但成本更高,因为您现在需要保持服务器正常运行以处理整个用户群的负载。