Easy Coding
  Forum Wiki Tagging Projekte Karte RSS
» Start
» All Recent Changes
» Wiki Suche
» Wiki Hilfe

Coder How To's

Algorithmen Informationen

edit SideBar

Neue Wiki Eintrage finden Sie unter easy-coding.de/wiki.

Apache md5 Verschlüsselung

htpasswd verschlüsselt das Passwort mit einem für Apache modifizierten MD5-Algorithmus oder aber der crypt() Routine. Die .htpasswd Datei kann gleichzeitig beide Formate enthalten. Unter Windows wird ausschließlich der MD5-Algorithmus angewandt, unter Linux wird er oftmals mit dem Parameter -m erzwungen.

Will man nun diesen "salted" Passwort Hash selbst erstellen, kann man auf keine PHP Standardfunktion zurückgreifen. Eine Lösung habe ich in einem Posting im PHP Manual gefunden: http://www.php.net/manual/en/function.crypt.php#73619

Hier der Code:

apache2-md5.php
  1. function crypt_apr1_md5($plainpasswd) {
  2.     $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
  3.     $len = strlen($plainpasswd);
  4.     $text = $plainpasswd.'$apr1$'.$salt;
  5.     $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
  6.     for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
  7.     for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
  8.     $bin = pack("H32", md5($text));
  9.     for($i = 0; $i < 1000; $i++) {
  10.         $new = ($i & 1) ? $plainpasswd : $bin;
  11.         if ($i % 3) $new .= $salt;
  12.         if ($i % 7) $new .= $plainpasswd;
  13.         $new .= ($i & 1) ? $bin : $plainpasswd;
  14.         $bin = pack("H32", md5($new));
  15.     }
  16.     for ($i = 0; $i < 5; $i++) {
  17.         $k = $i + 6;
  18.         $j = $i + 12;
  19.         if ($j == 16) $j = 5;
  20.         $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
  21.     }
  22.     $tmp = chr(0).chr(0).$bin[11].$tmp;
  23.     $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
  24.     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
  25.     "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
  26.     return "$"."apr1"."$".$salt."$".$tmp;
  27. }
  28.  
  29. echo crypt_apr1_md5('test');

Der Hash ist nach jeder Generierung anders. Aber er funktioniert.

Zuletzt geändert am 21.08.2007 20:33 Uhr
  Impressum