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

时间:2011-06-28 22:22:12

标签: c# asp.net web-services passwords password-encryption

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

外部Web服务的要求如下:

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

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

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

理想情况下,我想将每个(加密的)密码存储在我的数据库中,并在需要调用webservice时解密它。我应该遵循最佳做法吗?我应该使用Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.EncryptSymmetric(..)加密每个密码吗?

注意:遗憾的是,我无权更改外部API的功能。我必须遵守规定。

3 个答案:

答案 0 :(得分:6)

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

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

  2. 根本不打算存储密码历史记录 - 如果选择密码更改Web服务,则首次尝试失败,然后使用备用密码重新发送。这样,您就不会复制密码更改Web服务的业务规则(例如,假设他们将其更改为允许您在6个月后重新使用密码)。

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

答案 1 :(得分:1)

最简单的方法...使用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);

答案 2 :(得分:0)

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

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