2017-05-16 80 views
1

我有一個基於Web的工具。在登錄表單上,密碼在發送之前將被散列。 一切都好,數據庫只存儲哈希密碼。使用LDAP驗證之前的哈希密碼

現在,我們希望使用LDAP登錄DirectoryEntry。 但構造函數只接受普通密碼。

我的問題:如何將散列密碼傳遞給DirectoryEntry -class?

電流法:

public bool isAuthenticated(string domain, string username, string pwd) 
    { 
     string domainAndUsername = domain + @"\" + username; 
     DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd); 

     try 
     { 
      Object obj = entry.NativeObject; 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

回答

1

我不知道C#,但就LDAP協議去,沒有辦法與已經哈希密碼進行身份驗證。

爲什麼在傳輸密碼之前需要散列密碼?

如果要避免通過網絡傳輸它,最簡單的解決方案就是通過SSL連接到LDAP目錄。

作爲一個側面說明,國際海事組織,發送哈希密碼是不是清楚一個不太安全:

  • 如果攻擊者攔截請求,他將能夠與他發現無論哪種方式
  • 的數據來驗證
  • 如果攻擊者在轉儲數據庫成功和檢索哈希密碼,如果所有他需要做的是爲發送驗證,它呈現的事實存儲哈希密碼沒用

編輯:其它附加信息,

我不知道你使用的LDAP目錄,但OpenLDAP的,你可以實現這種機制下,如果你不使用綁定操作(例如,您將無法使用密碼策略覆蓋)。

您可以實現一個SASL Proxy Authorization到:

  • 連接到目錄與技術客戶
  • 搜索和檢索的嘗試登錄
  • 測試上,如果自定義哈希密碼屬性輸入用戶散列提供被存儲的一個
  • 重新綁定與另一技術帳戶與代理授權作爲該用戶

它將允許你仍然從ACL機制和記錄系統,爲用戶的操作進行

受益,但:這將是僅適用於OpenLDAP的(或者如果另一個LDAP實行提供相同的機制),它是不是真的關於LDAP協議的最新技術;)

+0

程序員有能力存儲所有傳入用戶(以及他們的普通傳遞)。整個公司必須信任程序員(我),我不這樣做。在LDAP之前,我在傳輸和散列(醃製)服務器端之前散列傳遞。我不能得到用戶傳遞和數據庫保存。 – user6537157

+0

@ user6537157好的,我可以理解這個想法。但LDAP協議不允許使用綁定操作的事實仍然適用;)至少不創建某種特定的代碼來允許後端的功能性(例如OpenLDAP覆蓋) – Esteban

+0

@ user6537157我添加了一些有關您可以實施的解決方法 – Esteban