2011-11-19 77 views
1

我正在使用單向散列加密進行練習。MVC密碼屬性散列

我有一個實體框架的MVC模型,我想存儲一個密碼值。我希望有一個只寫屬性,但我發現的是,如果我沒有返回值,那麼它不會被存儲在數據庫中。每當我訪問編輯視圖時,我都會看到我的散列。我可以通過在編輯視圖中使用空的通用密碼輸入字段來解決該問題。

現在,我現在遇到的問題是,如果用戶想要編輯他們的信息並且不更改他們的密碼(通過將其留空),即使我沒有更改該屬性的值,密碼字段也會設置爲空。

任何人都可以提出一個更好的方法嗎?預先感謝您的回覆。

[DataType(DataType.Password), MaxLength(50)] 
    private string _Password; 
    public string Password 
    { 
     get 
     { 
      return _Password; 
     } 

     set 
     { 
      if(!string.IsNullOrEmpty(value)) 
      { 
      _Password = FormsAuthentication.HashPasswordForStoringInConfigFile(value, "MD5"); 
      } 
     } 

    } 
+1

永遠不要使用'FormsAuthentication.HashPasswordForStoringInConfigFile'。暴力行爲太快了。使用成員資格類或Rfc2898DeriveBytes。 – CodesInChaos

回答

2

我發現要做到這一點的最好方法是在您的實體類上創建兩個屬性。其中一個將代表哈希密碼,並且它將被讀/寫,以便EF可以成功進行往返。將哈希密碼提供爲讀/寫是安全的,因爲從哈希中恢復明文是合理的不可行的。

第二個屬性應該表示密碼明文,並且應該是隻寫的(並且被EF忽略)。在它的setter中,您將散列密碼並將其存儲在其他屬性中。只有更改用戶密碼的代碼才能訪問此方法。

最後,您應該創建一個Validate()方法,該方法接受純文本密碼,對其進行哈希處理,然後將其與哈希屬性進行比較以進行身份​​驗證。

使用這種方法,您可以應用驗證屬性(例如,正則表達式)在明文只寫屬性上強制執行密碼複雜性策略,以便在您的密碼編輯器中進行綁定。您還可以使用只寫屬性來生成密碼歷史記錄子記錄,以強制執行密碼唯一性並更改頻率策略。

此外,您應該密碼密碼散列(我已經在過去使用過用戶GUID),以便兩個不同用戶使用的密碼不會具有相同的散列值。這可以通過將密碼明文與用戶相關的唯一但確定性的值連接起來,然後對其進行哈希處理。