erlang ldap sha1

erlang SSHA ldap



sha1 (3)

Mi erlang está muy oxidado, así que esto no es muy bonito, pero de todos modos puede ser una buena idea.

run() -> Password = "myPassword", HashRaw = os:cmd("slappasswd -s " ++ Password), Hash1 = lists:nthtail(6, HashRaw), Hash2 = lists:concat ([integer_to_list(X, 16) || X <- binary_to_list(crypto:sha(Password))]), string:equal(string:to_lower(Hash1), string:to_lower(Hash2)).

Mi idea es que tú:

  • Ejecute el comando cuya salida le interesa verificar (slappasswd), guarde la salida y recorte la decoración adicional que precede al hash.
  • Ejecute crypto:sha() desde las bibliotecas de erlang. Tome la salida binaria de esto y conviértala en una lista de enteros, cada uno de los cuales luego convertirá a una cadena hexadecimal, que luego concatenará, y de ese modo creará Hash2.
  • Compare la salida de su comando con la salida de crypto:sha()

EDITAR: No tengo este comando que está utilizando, por lo que realmente no podría intentar esto ... Pero funciona para sha1sum . ¡Espero que sean lo mismo!

Dada una contraseña de LDAP almacenada en SHA-1 / {SSHA}, ¿cómo la validaría en erlang?

Por ejemplo, dado el siguiente {SSHA}:

% slappasswd -s myPassword {SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP %

¿Cómo puedo (en erlang) validar que el texto claro ''myPassword'' coincide con el valor hash de ''{SSHA} GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP''.


Después de la ayuda de otros, he creado una rutina para hacer esto en Erlang. Siguiendo aquí para compartir con otros.

Primero, este enlace (que se encuentra en otra publicación) da funciones en otros idiomas haciendo lo que yo quería:

El truco fue que la codificación ''ldap {SSHA}'' es un hash salado SHA1 que también está codificado en base64. Entonces, debe decodificarlo, extraer la sal y luego usar eso en la recodificación de la ''contraseña clara'' para comparar.

Aquí hay una breve rutina de Erlang que hace esto:

validatessha(ClearPassword, SshaHash) -> D64 = base64:decode(lists:nthtail(6, SshaHash)), {HashedData, Salt} = lists:split(20, binary_to_list(D64)), NewHash = crypto:sha(list_to_binary(ClearPassword ++ Salt)), string:equal(binary_to_list(NewHash), HashedData).

Teniendo en cuenta los datos en mi publicación original, aquí está el resultado:

67> run:validatessha("myPassword", "{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP"). true 68>

Gracias a todos.

Micro


Las contraseñas almacenadas en un servidor de directorio se validan utilizando la operación BIND . Un servidor de directorio debidamente configurado y seguro no permitirá el acceso a datos de contraseña; por lo tanto, los clientes LDAP no deben codificarse esperando que los datos de la contraseña estén disponibles, ya sean encriptados o codificados. Los clientes LDAP deben usar la operación BIND para validar las contraseñas.