2011-06-28 47 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);