SSHA (o traducido SHA1 con un poco de sal) es el método que utiliza Zimbra para cifrar las contraseñas de usuario.

A cada usuario dentro del árbol LDAP “ou=people,dc=miempresa,dc=com” se le añade un subschema o un objeto llamado “zimbraAccount” este subschema, también conocida como una objectClass, contiene más atributos pertenecientes al usuario. Entre estos atributos está el userPassword.

Veamos esta objectClass:

# cd /opt/zimbra/openldap/bin
# ./ldapsearch -H ldap://zimbra.miempresa.com -x -b
   "uid=amperis,ou=people,dc=miempresa,dc=com"
# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# amperis, people, miempresa.com
dn: uid=amperis,ou=people,dc=miempresa,dc=com
zimbraMailTransport: lmtp:zimbra.miempresa.com:7025
zimbraMailDeliveryAddress: amperis@miempresa.com
sn: Alejandro Moreno
zimbraMailStatus: enabled
zimbraId: 4ab82437-ff86-45f8-bbd0-76508e7527e4
mail: amperis@miempresa.com
displayName: Alejandro Moreno
uid: amperis
objectClass: organizationalPerson
objectClass: zimbraAccount
objectClass: amavisAccount
cn: Alejandro Moreno
zimbraMailHost: zimbra.miempresa.com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Veamos ahora el contenido de la objectClass para el usuario “amperis@miempresa.com”:

# su - zimbra
# zmlocalconfig -s zimbra_ldap_password
zimbra_ldap_password = asdfghjklñ

# exit
# ./ldapsearch -H ldap://zimbra.miempresa.com -w asdfghjklñ -D
   "uid=zimbra,cn=admins,cn=zimbra" -x "(&(objectClass=zimbraAccount)
   (mail=amperis@miempresa.com))"

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (&(objectClass=zimbraAccount)(mail=amperis@miempresa.com))
# requesting: ALL
#

# amperis, people, miempresa.com
dn: uid=amperis,ou=people,dc=miempresa,dc=com
zimbraMailTransport: lmtp:zimbra.miempresa.com:7025
zimbraAccountStatus: active
zimbraMailDeliveryAddress: amperis@miempresa.com
sn: Alejandro Moreno
zimbraMailStatus: enabled
zimbraId: 4ab82437-ff86-45f8-bbd0-76508e7527e4
mail: amperis@miempresa.com
displayName: Alejandro Moreno
uid: amperis
objectClass: organizationalPerson
objectClass: zimbraAccount
objectClass: amavisAccount
cn: Alejandro Moreno
zimbraMailHost: zimbra.miempresa.com
zimbraLastLogonTimestamp: 20090126085702Z
userPassword:: e1NTSEF9ajJrc3JGUGNkck9ZMVNJUHdQY2pBSXR1REw4aHlSbEE=
zimbraPasswordModifiedTime: 20090127170140Z

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Podéis ver el resultado de “userPassword=e1NTSEF9ajJrc3JGUGNkck9ZMVNJUHdQY2pBSXR1REw4aHlSbEE=”. Esto no es la password encriptada, sino la password codificada en Base64.

Si decodificamos la Base64 tenemos:

decodeBase64(e1NTSEF9ajJrc3JGUGNkck9ZMVNJUHdQY2pBSXR1REw4aHlSbEE=) =
{SSHA}j2ksrFPcdrOY1SIPwPcj8ItuDL8hyRlA

Por tanto el userPassword es “j2ksrFPcdrOY1SIPwPcj8ItuDL8hyRlA” y está hasheado con el algoritmo SSHA. OpenLDAP proporciona varios métodos para cifrar la información:
MD5, SHA1, SSHA, CRYPTO, etc.

El algoritmo SSHA (salted-SHA) se basa en SHA1 añadiendo un token o salt al password del usuario.


userPassword = SHA1(password_usuario + token)

¿alguien se anima a bajarse los fuentes de Zimbra y decirme cual es este token?