PHP - ldap_add 用户密码加密和 password_hash

PHP - ldap_add userPassword crypt and password_hash

我正在使用 PHP 7.1。 并创建 LDAP 管理页面。

当使用 ldap_add() 函数时。 有 ['userPassword'] 字段。

当我使用下面的代码时,一切正常。 (如果salt不存在也没关系。)

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

或者下面的代码也可以。

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

但是我读PHP比crypt()更推荐password_hash()函数。

我可以使用 LDAP 的 password_hash() 功能吗?可能吗?

更新:

好的。那么 LDAP 密码的最佳解决方案是什么?

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

这不起作用。

我猜这取决于你的目录,但 LDAP 中的密码通常以 {MD5}{CRYPT} 等方案存储

如果你想使用其他东西,你必须符合你使用的目录所支持的机制。

关于password_hash的建议,事实是:

  • password_hash 只是 crypt 的包装,默认选项设置为

  • password_hash 并非旨在为专用身份验证机制创建哈希 [​​=17=]

    建议需要在数据库中存储哈希并将未来密码与该哈希进行比较而不受所用哈希机制限制的开发人员使用。

事实上,LDAP 协议支持这些身份验证,您必须遵守目录支持的机制。

所以由于password_hash函数似乎没有提供使用的散列机制的选择,我会说你不能使用它。或者至少,它不会为您提供比 crypt 或目录中其他受支持且随时可用的机制更多的“安全性”。

PHPs 密码散列机制适用于仅在 PHP 内处理密码的情况。那么用password_hash创建密码,password_verify验证密码就好了。这里使用的后端完全无关。

另一方面,LDAP 使用 ldap_bind 不仅可以验证密码,还可以将用户绑定到 LDAP 服务器。这就像登录到服务器。为此,可以使用不同的加密算法,例如 cryptmd5(我们不再使用它们……)。

由于不同的系统可以使用此绑定机制来验证登录,因此需要使用 LDAP 支持的加密算法,以便 LDAP 服务器可以处理密码验证。

因此,当您想使用存储在 LDAP 中的密码在不同系统上通过绑定使用 LDAP 验证时,您将无法使用 password_hash

如果您只想在 PHP-应用程序中使用密码,您 可以 使用 password_hash,但我不会将其放入 userPassword-属性,因为这是 LDAP 服务器用来验证绑定给定的密码的属性。并且您通常只能在通过管理员或相关用户身份验证后才能阅读该字段,由于用户无法处理密码,您将无法登录。因此,您需要以管理员用户身份绑定到 LDAP,这会给您的应用程序带来比使用 password_hash 解决的安全问题更多的问题。

而且我还想问,当您不使用 LDAP 的好处(例如多个系统的一个密码)时,使用 LDAP 作为后端有什么意义。将信息存储在数据库中通常比为单个项目设置 LDAP 容易得多。