2011-06-28 49 views
9

我有一个ASP.Net C#应用程序需要每5分钟使用WebServices连接到外部API。是存储和更新外部API密码的最佳实践

外部web服务的要求如下:

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

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

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

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

注意:不幸的是,我无法改变外部API的功能。我必须遵守所提供的规则。

+0

棒在密码的最后一个5位计数器,与数个月以来2010年? –

回答

6

关于密码历史我会往下走两条路线之一:

  1. 根据你目前的计划,存储密码文件/数据库/配置 - 建议你使用哈希算法(与加密相反)将新密码与存储的密码哈希值进行比较以获得“相等”。

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

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

0

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

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

+0

这似乎并没有解决我的问题。 – Jon

+0

-1动态修改web.config似乎是一个可怕的想法 – Earlz

+0

@earlz - 没有动态修改。您可以在部署时从命令行执行此操作。我想建议你撤消这个倒退,因为它不是一个知情的投票。谢谢。 – Kev

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);