存储和更新外部 API 密码的最佳实践

Posted

技术标签:

【中文标题】存储和更新外部 API 密码的最佳实践【英文标题】:Best Practice for Storing and Updating External API Passwords 【发布时间】:2011-09-24 17:18:06 【问题描述】:

我有一个 ASP.Net C# 应用程序,它需要每 5 分钟使用 WebServices 连接到外部 API。

External Webservice的要求如下:

需要用户名和密码 我必须在每个 Web 服务请求中传输用户名和密码 密码每 90 天过期一次,必须在过期日期之前更改 无法手动更改密码(人工),我的应用程序必须连接到单独的密码更改 Web 服务才能更改密码。 我的应用程序必须根据一组规则生成每个新密码。 密码永远不能重复使用。 需要 SSL、证书和防火墙 IP 限制

我已经构建了所有以前的,但我目前有一个问题。存储当前和历史密码的最佳做法是什么?

显然存储明文密码是一个不好的解决方案。我需要能够让我的网络服务读取密码并在每个请求中传输它。我还需要能够访问所有历史密码,以确保我新生成的密码不重复。

理想情况下,我想将每个(加密的)密码存储在我的数据库中,并在我需要调用 web 服务时对其进行解密。是否有我应该遵循的最佳实践?我应该使用 Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.EncryptSymmetric(..) 加密每个密码吗?

注意:很遗憾,我无权更改外部 API 的运行方式。我必须遵守提供的规则。

【问题讨论】:

在密码末尾贴一个 5 位计数器,从 2010 年开始的月份数? 【参考方案1】:

ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 可以加密和解密 web.config 的部分。应用程序中不需要特殊代码,因为 ASP.NET 2.0 会在运行时神奇地解密部分。

http://msdn2.microsoft.com/en-us/library/zhhddkxy.aspx

【讨论】:

-1 动态修改 web.config 似乎是一个可怕的想法 @earlz - 没有任何东西是动态修改的。您可以在部署时从命令行执行此操作。我想建议您撤消该否决票,因为这不是知情投票。谢谢。 即便如此,似乎 OP 要求他的程序能够允许在运行时更改密码,因此如果他要使用此策略,他的程序将需要修改 web.config。跨度> 我自己现在很欣赏这一点,但模组收到的评论不准确。【参考方案2】:

关于密码历史,我会选择以下两条路线之一:

    根据您当前的计划,将密码存储在文件/db/config 中 - 建议您使用散列算法(而不是加密)将新密码与存储的密码散列进行“相等”比较。

    根本不必费心存储密码历史记录 - 如果第一次尝试更改密码 Web 服务也会失败,然后使用备用密码重新发送。这样,您就不会复制密码更改 Web 服务的业务规则(例如,假设他们更改它以允许您在 6 个月后重新使用密码)。

关于存储当前密码:假设您必须以明文形式发送密码,那么是的,您应该以加密形式存储它。有很多关于如何做到这一点的文章out there。或者您甚至可以加密配置文件的特定部分,例如 seen here。

【讨论】:

【参考方案3】:

最简单的方法...使用 ProtectedData 类:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx

byte[] bytes = System.Text.Encoding.UTF8.GetBytes(password);
byte[] cypher = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);
//... reverse
byte[] bytes = ProtectedData.Unprotect(cypher, null, DataProtectionScope.CurrentUser);
string password = System.Text.Encoding.UTF8.GetString(bytes);

【讨论】:

以上是关于存储和更新外部 API 密码的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

使用明文密码访问 REST API 的最佳实践

Django/Python:处理多个多向外部 API 的外部 ID 的最佳实践/建议

最佳实践(读取外部数据)

在 S3 中使用带有外部存储的图像和缩略图进行数据库设计的最佳实践?

在 git 存储库中处理密码的最佳实践是啥?

Node 中密码存储的密码学最佳实践