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

Jon*_*Jon 9 c# asp.net passwords web-services password-encryption

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

外部Web服务的要求如下:

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

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

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

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

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

Red*_*dog 6

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

  1. 根据您当前的计划,将密码存储在文件/ db/config中 - 建议您使用散列算法(而不是加密)来比较新密码和存储的密码哈希"相等".

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

关于存储当前密码:假设您必须以明文形式发送密码,那么是的,您应该以加密形式存储密码.有很多文章在那里就如何做到这一点.或者您甚至可以加密配置文件的特定部分,如此处所示.