Création passwd (.htaccess AuthUserFile) à la volée [Résolu]

Signaler
-
 olfdeus -
Bonjour,

Je suis confronté à la problématique suivante :

- contexte : suite à la reprise d'un poste, la sécurité des applications web se fait par .htaccess AuthUserFile sur un service apache/PHP sur Windows.

- J'ai donc effectué une petite application pour rendre indépendant les utilisateurs dans leurs gestion des droits (création .htaccess et passwd à la volée).


- Problème : le mot de passe généré par la fonction md5() de php n'est pas reconnu (j'ai aussi testé cypt()).
- J'ai testé directement le bin en ligne de commande, et en effet le résultat n'est pas le même.

Ex :
En clair -> pierre:pierre (fonctione)
En ligne de commande -> pierre:$apr1$8RIjNXQt$yh5AEM4pwKXqyDAT8hQeC0 (fonctionne)
En hachage par fonction PHP md5() -> pierre:84675f2baf7140037b8f5afe54eef841 (ne fonctionne pas)

Ma question :
- Comment trouver l'algorithme utilisé ?
- Ou que faire pour pouvoir générer le bon mot de passe à travers PHP ?
Merci.

5 réponses

Messages postés
403
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
3 septembre 2012
2
La réponse est ici :
http://www.php.net/manual/en/function.crypt.php#73619

function crypt_apr1_md5($plainpasswd) {
    $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
    $len = strlen($plainpasswd);
    $text = $plainpasswd.'$apr1$'.$salt;
    $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
    for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
    for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
    $bin = pack("H32", md5($text));
    for($i = 0; $i < 1000; $i++) {
        $new = ($i & 1) ? $plainpasswd : $bin;
        if ($i % 3) $new .= $salt;
        if ($i % 7) $new .= $plainpasswd;
        $new .= ($i & 1) ? $bin : $plainpasswd;
        $bin = pack("H32", md5($new));
    }
    for ($i = 0; $i < 5; $i++) {
        $k = $i + 6;
        $j = $i + 12;
        if ($j 16) $j 5;
        $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
    }
    $tmp = chr(0).chr(0).$bin[11].$tmp;
    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    return "$"."apr1"."$".$salt."$".$tmp;
}
La capture d'écran correspond à la ligne "- J'ai testé directement[...]".
En fait je reformule mon besoin :
Quelqu'un à la fonction php pour l'apr1?
Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

htpasswd utilise une version propre à apache du md5 (une version modifiée de md5 en fait).

Je n'ai pas reussi à trouver de code en PHP implémentant ce truc. Par contre, vu que htpasswd est libre, l'implémentation "maison" de md5 est dispo dans les sources (voir la fonction apr_md5_encode() de apr_md5.c que tu peux trouver sans autres ici: http://www.opensource.apple.com/source/apr/apr-12/apr-util/apr-util/crypto/apr_md5.c ).