PHP-ldap\u添加用户密码加密和密码散列
我正在使用PHP7.1。 并创建LDAP管理页面 使用ldap_add()函数时。 有['userPassword']字段 当我使用下面的代码时,它工作正常。(如果盐不存在,也可以。) 或者下面的代码也可以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
$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.'$');