2017-06-23 175 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或其他受支持和易于使用的机制。