PHP-ldap\u添加用户密码加密和密码散列

PHP-ldap\u添加用户密码加密和密码散列,php,ldap,password-hash,Php,Ldap,Password Hash,我正在使用PHP7.1。 并创建LDAP管理页面 使用ldap_add()函数时。 有['userPassword']字段 当我使用下面的代码时,它工作正常。(如果盐不存在,也可以。) 或者下面的代码也可以 $entry['userPassword'] = '{MD5}'.'base64_encode(pack("H*", md5('default_password'))); 但是我读过PHP推荐的password\u hash()函数比crypt() 我可以为LDAP使用password\u

我正在使用PHP7.1。 并创建LDAP管理页面

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

当我使用下面的代码时,它工作正常。(如果盐不存在,也可以。)

或者下面的代码也可以

$entry['userPassword'] = '{MD5}'.'base64_encode(pack("H*", md5('default_password')));
但是我读过PHP推荐的
password\u hash()
函数比
crypt()

我可以为LDAP使用
password\u hash()
函数吗?可能吗

更新:

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

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

这不起作用。

我想这取决于您的目录,但LDAP中的密码通常是用一个方案存储的
{MD5}
{CRYPT}
,等等

如果要使用其他内容,则必须遵守所使用目录支持的机制

关于
密码\u散列
的建议,事实是:

  • password\u hash
    只是设置了默认选项的
    crypt
    的包装

  • 密码\u散列
    不用于为专用身份验证机制创建散列

    建议开发人员在数据库中存储散列,并将未来密码与此散列进行比较,而不受所用散列机制的限制

由于LDAP协议支持这些身份验证,您必须遵守目录支持的机制


因此,由于
password\u hash
函数似乎没有提供所用哈希机制的选择,我认为您不能使用它。或者至少,它不会比crypt或目录中其他受支持且随时可用的机制为您提供更多的“安全性”。

我想这取决于您的目录,但LDAP中的密码通常是以一种模式存储的
{MD5}
{crypt}
,等等

如果要使用其他内容,则必须遵守所使用目录支持的机制

关于
密码\u散列
的建议,事实是:

  • password\u hash
    只是设置了默认选项的
    crypt
    的包装

  • 密码\u散列
    不用于为专用身份验证机制创建散列

    建议开发人员在数据库中存储散列,并将未来密码与此散列进行比较,而不受所用散列机制的限制

由于LDAP协议支持这些身份验证,您必须遵守目录支持的机制


因此,由于
password\u hash
函数似乎没有提供所用哈希机制的选择,我认为您不能使用它。或者至少,它不会比crypt或目录中其他受支持且随时可用的机制为您提供更多的“安全性”。

PHPs密码哈希机制适用于只在PHP中处理密码的情况。然后使用
password\u hash
创建密码,并使用
password\u verify
验证密码。这里使用的后端完全不相关

另一方面,LDAP使用
LDAP\u bind
不仅验证密码,还将用户绑定到LDAP服务器。这就像登录到服务器一样。因此,可以使用不同的加密算法,如
crypt
md5
(我们不再使用了…)

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

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

如果您只想在PHP应用程序中使用密码,可以使用
password\u hash
,但我不会将其放入
userPassword
-属性中,因为LDAP服务器使用该属性来验证bind提供的密码。通常,只有当您作为管理员或相关用户进行身份验证时,您才能读取该字段,而由于用户无法处理密码,您将无法登录该字段。因此,您需要以管理员用户的身份绑定到LDAP,这会给您的应用程序带来比使用
密码\u散列
解决的安全问题多得多的安全问题


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

PHPs密码哈希机制适用于只在PHP中处理密码的情况。然后使用
password\u hash
创建密码,并使用
password\u verify
验证密码。这里使用的后端完全不相关

另一方面,LDAP使用
LDAP\u bind
不仅验证密码,还将用户绑定到LDAP服务器。这就像登录到服务器一样。因此,可以使用不同的加密算法,如
crypt
md5
(我们不再使用了…)

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

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

如果只想在PHP应用程序中使用密码,可以使用
password\u hash
,但我不会将其放入
userPassword
-属性中,因为LDAP服务器使用该属性来验证密码
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$entry['userPassword'] = '{crypt}'.crypt('defaultpassword', '$2y$10$'.$salt.'$');