Agregar usuarios con contraseña con hash MD5 (hashed MD5 password) en OpenLDAP.

En este post voy a explicar como agregar usuarios con contraseña con hash MD5 (hashed MD5 password) en OpenLDAP.

La idea es “decirle” a nuestro OpenLDAP el tipo de HASH (ejemplo: {MD5}) antes de donde va la contraseña, esta contraseña será el resultado de cifrar como BASE64 el BINARIO del hash MD5. osea… no es que vamos a cifrar nuestra contraseña en MD5 y después directamente vamos a cifrar ese resultado en BASE64. No vamos a cifrar en BASE64 directamente los hashes que nos den como resultado las funciones de PHP: md5() o sha(). ES IMPORTANTE pasar el primer HASH MD5 a binario con la función pack(“H*”, $hash_result), tanto md5() y sha() dan como resultado cadenas de textos hexadecimales las cuales serán transformadas en binarios y recien convertidas en BASE64.

base64_encode(pack(‘H*’,md5($newuser_plaintext_password)));

A continuación paso el código para hacer éste tipo especial de cifrado para usarlo con OpenLDAP, la salida de éste codigo sería algo similar a esto: {md5}bdwy04RS4xMDGVi1n/H36Q==

Algunas advertencias finales a tener en cuenta:
– todo esto no funciona con Active Directory donde las contraseñas son solo creadas usando conecciones SSL y los hashes es muy probable que trabajen de manera distinta.

$ds = ldap_connect($serverAddress);
if ($ds) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

$r = ldap_bind($ds, $managerDN, $managerPassword);
$ldaprecord[‘cn’] = $newuser_username;
$ldaprecord[‘givenName’] = $newuser_firstname;
$ldaprecord[‘sn’] = $newuser_surname;

$ldaprecord[‘objectclass’][0] = “person”;
$ldaprecord[‘objectclass’][1] = “organizationalPerson”;
$ldaprecord[‘objectclass’][2] = “inetOrgPerson”;
$ldaprecord[‘mail’] = $newuser_email_address;
$ldaprecord[‘telephoneNumber’] = $newuser_phone_number;

// aqui viene el truquito:
$ldaprecord[‘userPassword’] = ‘{MD5}’ . base64_encode(pack(‘H*’,$newuser_md5hashed_password));

// Este seria el truco si tienen la contraseña en texto plano
// entonces se pasaría a MD5, luego a binario y recien Base64:
// $ldaprecord[‘userPassword’] = ‘{MD5}’ .
// base64_encode(pack(‘H*’,md5($newuser_plaintext_password)));

$r = ldap_add($ds, $base_user_dn, $ldaprecord);
} else { die “cannot connect to LDAP server at $serverAddress.”; }

Credits:
José Marin de la Fuente
www.marindelafuente.com.ar

Compartir