Encoding des mots de passes en base64

Bonjour,

Actuellement notre serveur de production tourne sous jboss 4.2 et les mots de passes sont hashé en base64.

Je suis entrain de préparer une mise à jours du systeme pour remplacer jboss par Tomcat 8 ( 8.0.36 ).

Sur l’environnement de developpement j’ai hashé les mots de passes en changeant le paramètre système HASH_PASWORD avec la valeur “BASE64”.

J’ai rajouté les paramètres suivant dans le context.xml du server tomcat:

<Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/simplicite" localDataSource="true" userTable="m_user" userNameCol="usr_login" userCredCol="usr_password" userRoleTable="m_user" roleNameCol="'simplicite'" digest="MD5" digestEncoding="base64" />

Lorsque je lance le serveur tomcat, j’obtiens l’erreur suivante dans les logs :

org.apache.catalina.rea lm.MessageDigestCredentialHandler.setEncoding The encoding [base64] is not supported so the current setting of [UTF-8] will still be used

J’ai également tenté d’utiliser le parametre hash.pwd=true dans le build.properties (utilisé sur jboss) sans succés.

Est il possible d’encoder les mots de passe en base64 avec Tomcat ? Si oui, quel est la démarche à suivre ?

Merci d’avance,
Cordialement,
Arthur Saint-Genis

Bonjour,

Je rencontre également le même problème.

digest est deprecated en tomcat 8 et sera supprimé pour tomcat 9.

Il faudrait utiliser le nested élément credentialhandler qui sait gérer ce type de password (MD5, Base64) et qui remplace l’élément digest du Realm.

<credentialhandler
         className="org.apache.catalina.realm.MessageDigestCredentialHandler"
         algorithm="md5" />

Bonjour,

J’arrive correctement à faire fonctionner le credentialHandler:

<Realm>
<CredentialHandler
className="org.apache.catalina.realm.MessageDigestCredentialHandler"
algorithm="md5"
encoding="base64"/>
</realm>

Mais le problème reste identique avec ou sans l’attribut encoding=‘base64’. les mot de passes sont simplement hashé et non encodé en base64.

Cordialement,
Arthur

Bonjour,

Je reprends le sujet après le départ d’Arthur.
Le credentialhandler a été paramétré de cette façon


Le paramètre système HASH_PASWORD a été paramétré avec la valeur “BASE64”.

Les mots de passe sont bien créés avec le hachage et l’encodage correct.
Par contre ils ne sont pas reconnus au moment du login.

Avez-vous eu d’autres échanges avec Arthur sur le sujet ?
Est-ce qu’il y a un problème dans le paramétrage qu’on utilise ?

Merci d’avance
Emmanuelle

Avec Tomcat 8.0.x et 8.5.x, la config suivante fonctionne (c’est celle que nous utilisons sur nos sandboxes cloud):

        <Realm
                className="org.apache.catalina.realm.DataSourceRealm"
                dataSourceName="jdbc/simplicite"
                localDataSource="true"
                userTable="m_user" userNameCol="usr_login" userCredCol="usr_password"
                userRoleTable="m_user" roleNameCol="'simplicite'">
                <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="MD5"/>
        </Realm>

et HASH_PASSWORD = HEX

NB: le parametre encoding du CredentialHandler correspond au charset (e.g. UTF-8), je pense qu’y mettre base64 n’a pas de sens(cf. https://tomcat.apache.org/tomcat-8.0-doc/config/credentialhandler.html)

Hello,

Merci pour ta réponse.
Oui en effet ça fonctionne mais c’est encodé en hexadecimal.

Or sur la prod les mots de passe sont encodés en base 64.

Le mot de passe simplicite sur la prod : vzEhpRj0A8O91uwd2vQHQw==
Sur la dev avec le paramétrage que tu m’indiques : bf3121a518f403c3bdd6ec1ddaf40743

Du coup si on passe sur tomcat en prod, bin plus personne n’arrivera à se connecter j’imagine ?

Merci
Emmanuelle

Il ne faut pas confondre hashage et encodage.

Dans Simplicité l’algorithme de hashage est MD5 dans tous les cas et depuis toujours.

Ensuite pour stocker en base on l’encode, soit en hexadecimal soit en base 64 et c’est sur ça uniquement qu’influe le param system HASH_PASSWORD.

L’encodage, contrairement au hashage, est réversible, autrement dit il est possible de décoder une chaîne de caractère encodée en hexadécimal et la réencoder en base 64

Si je comprends bien la doc du credential handler de Tomcat 8, il s’attend à trouver en base:

  • soit un mot de passe encodé en hexadécimal
  • soit un mot de passe encodé en base 64 avec {MD5} au début

Je pense que le pb est que Simplicité ne met pas ce {MD5} au début sur les chaines encodées en base 64, ça ne posait visiblement pas de pb au Tomcat 5.5 embarqué dans JBoss 4 mais ça doit être bloquant avec Tomcat 8.

Je vais faire qques tests et je te dis.

J’ai fait le test suivant:

  • creation d’un user test
  • verification du mot de passe en base: select usr_password from m_user where usr_login = 'test', résultat = bf3121a518f403c3bdd6ec1ddaf40743 (soit simplicite hashé en MD5 et encodé en hexadecimal)
  • j’arrive bien à me connecter avec ce user test
  • mise à jour en bse du mot de passe avec simplicite hashé en MD5 et encodé en base 64 et avec {MD5} au début: update m_user set usr_password = '{MD5}vzEhpRj0A8O91uwd2vQHQw==' where usr_login = 'test'
  • j’arrive toujours à me connecter avec le user test

Bref il faut bien ajouter {MD5} au début des passwords encodés en base 64 (et on peut avoir à la fois des passwords encodés en hexadécimal et en base 64 en base).

Coté Simplicité on va faire la modif pour que la méthode d’encodage de passwords en base 64 (i.e. quand HASH_PASSWORD = BASE64) ajoute bien ce '{MD5}` au début

La modif est faite. Elle sera livrée dans les prochaines releases de maintenances: 3.0 maintenance 30, 3.1 maintenance 10 et 3.2 maintenance 05

Comme indiqué dans les releases notes draft de ces releases, pour reprendre les passwords encodés en base 64 il suffit de faire cet update en base:

update m_user set usr_password = '{MD5}' || usr_password where usr_password is not null

En attendant la release il faut bien rester en encodage HEX au niveau du HASH_PASSWORD (cela signifie que les éventuels passwords modifiés et/ou nouveaux password seront encodés en hexadécimal, pas de pb le realm Tomcat sait gérer…).

PS: Je profite de cet échange pour rappeler que la version de Tomcat recommandée est désormais la 8.5, en effet la 8.0 est en fin de vie et la 9.0 n’est pas encore assez stable (passer de 8.0 en 8.5 ne pose aucun pb)

Super merci beaucoup j’ai testé ça marche aussi sur notre base.

J’attends le patch pour mettre à jour et je note pour la version de tomcat

Emmanuelle