2017-06-23 173 views
1

我正在使用PHP 7.1。 並創建LDAP管理頁面。PHP - ldap_add userPassword crypt和password_hash

使用ldap_add()函數時。 有['userPassword']字段。

當我使用下面的代碼時,這工作正常。 (如果鹽不存在,那很好。)

$entry['userPassword'] = '{crypt}'.crypt('default_password'); 

或者下面的代碼也是可以的。

$entry['userPassword'] = '{MD5}'.'base64_encode(pack("H*", md5('default_password'))); 

不過,我看到PHP建議比crypt()password_hash()功能。

我可以使用password_hash()函數用於LDAP嗎?可能嗎?

UPDATE:

OK。那麼什麼是LDAP密碼的最佳解決方案?

$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'); 
$entry['userPassword'] = '{crypt}'.crypt('defaultpassword', '$2y$10$'.$salt.'$'); 

這是行不通的。

回答

2

PHPs Passwords Hashing機制旨在用於僅在PHP中處理密碼時使用。然後使用password_hash創建密碼並且password_verify驗證密碼是非常好的。這裏使用的後端是完全不相關的。

另一方面,LDAP使用ldap_bind不僅驗證密碼,而且還將用戶綁定到LDAP服務器。這就像登錄到服務器。爲此,可以使用不同的加密算法,如cryptmd5(我們不再使用它)。

由於此綁定機制可供不同系統用於驗證登錄,因此需要使用LDAP支持的Crypto-Algos,以便LDAP-Server可以處理密碼驗證。

因此,當您想要通過在不同系統上使用LDAP存儲在LDAP中的密碼來使用LDAP驗證時,您將無法使用password_hash

如果你只想與你的PHP應用中使用的密碼,您可以使用password_hash,但我不會把它放到userPassword -attribute因爲這是LDAP服務器使用來驗證給出一個口令一個綁定。而且,當您通過身份驗證時,您通常只能閱讀該字段,無論是管理員還是有問題的用戶,由於用戶無法處理密碼,您將無法登錄。因此,您需要以管理員用戶身份綁定到LDAP,這會爲您的應用程序增加更多的安全問題,而不是使用password_hash解決方案。

而且我也想問一下,如果您沒有像多個系統的一個密碼一樣使用LDAP的好處,它將使用LDAP作爲後端的意義何在。將信息存儲在數據庫中通常比爲單個項目設置LDAP要容易得多。

+0

請看我的更新 – Horangs

+0

當你在這裏問一個新的問題:你會不會也創造一個新的問題?謝謝! – heiglandreas

1

我要看你的目錄我想,但在LDAP常用密碼存儲與方案{MD5}{CRYPT}

如果你想用別的東西,你必須要符合那些機制由您使用的目錄支持。

的意見有關password_hash,事實是:

  • password_hash只是使用默認選項的crypt包裝設置
  • password_hash不打算創建一個哈希專用的認證機制

    對於需要將散列存儲在數據庫中的開發人員以及將未來的密碼與此散列進行比較而不使用關於所使用的散列機制的約束,建議使用這種方法。

LDAP協議支持這些身份驗證的事實,您必須遵守目錄支持的機制。

因此,由於password_hash函數似乎沒有提供所用散列機制的選擇,所以我會說你不能使用它。或者至少,它不會提供給你更多的「安全性」來使用它,而不是你的目錄中的crypt或其他受支持和易於使用的機制。