code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:password-hash-generator -> password-hash-generator.php
md5:1994676de788905f37c965fcf44b4f64
sha1:ea91265c918296253857d89e174d3284c3f95572
Download-Link:Download
  1. <?php
  2. $translator = new i10n();
  3.  
  4. if ( ! empty( $_POST['STRING']) and $_POST['STRING'] and ! empty( $_POST['trimString'] ) ) {
  5.         $_POST['STRING'] = trim( $_POST['STRING'] );
  6. }
  7.  
  8. if ( defined( 'PASSWORD_BCRYPT'  ) ) {
  9.         $arrPHPMethods[] = 'PASSWORD_BCRYPT';
  10.         $arrPHPMmethods['PASSWORD_BCRYPT'] = PASSWORD_BCRYPT;
  11. }
  12. if ( defined( 'PASSWORD_ARGON2I' ) ) {
  13.         $arrPHPMethods[] = 'PASSWORD_ARGON2I';
  14.         $arrPHPMmethods['PASSWORD_ARGON2I'] = PASSWORD_ARGON2I;
  15. }
  16. if ( defined( 'PASSWORD_ARGON2ID' ) ) {
  17.         $arrPHPMethods[] = 'PASSWORD_ARGON2ID';
  18.         $arrPHPMmethods['PASSWORD_ARGON2ID'] = PASSWORD_ARGON2ID;
  19. }
  20.  
  21. $arrPHPOpenSSLMethods = openssl_get_md_methods();
  22.  
  23. $arrUnixSSLMethods = false;
  24. if ( '' != trim( `which openssl` ) ) {
  25.         $arrUnixSSLMethods = getOpenSSLDigests();
  26. }
  27.  
  28. $arrCryptMethods = [];
  29. if ( defined( 'CRYPT_STD_DES' ) and 1 == CRYPT_STD_DES )         $arrCryptMethods[] = 'STD_DES';
  30. if ( defined( 'CRYPT_EXT_DES' ) and 1 == CRYPT_EXT_DES )         $arrCryptMethods[] = 'EXT_DES';
  31. if ( defined( 'CRYPT_MD5' ) and 1 == CRYPT_MD5 )                         $arrCryptMethods[] = 'MD5';
  32. if ( defined( 'CRYPT_BLOWFISH' ) and 1 == CRYPT_BLOWFISH ) {
  33.         $arrCryptMethods[] = 'BLOWFISH-2a';
  34.         $arrCryptMethods[] = 'BLOWFISH-2x';
  35.         $arrCryptMethods[] = 'BLOWFISH-2y';
  36. }
  37. if ( defined( 'CRYPT_SHA256' ) and 1 == CRYPT_SHA256 )   $arrCryptMethods[] = 'SHA-256';
  38. if ( defined( 'CRYPT_SHA512' ) and 1 == CRYPT_SHA512 )   $arrCryptMethods[] = 'SHA-512';
  39.  
  40. $arrOtherMethods[] = 'PHP-md5()';
  41. $arrOtherMethods[] = 'PHP-sha1()';
  42. $arrOtherMethods[] = 'Old Unix passwd';
  43. $arrOtherMethods[] = 'Old Unix passwd ($1$)';
  44. $arrOtherMethods[] = 'Old Apache <= 2.0';
  45. $arrOtherMethods[] = 'Apache > 2.0';
  46. $arrOtherMethods[] = 'Old MySQL-passwd()';
  47. filter_var( $arrPHPMethods, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
  48. $selectorPHP  = '<legend for="PHPMethode">' . $translator -> get('PHP-password_hash()-methods') . ':</legend><select onchange="clearHash();" id="PHPMethode" name="PHPMethode">' . PHP_EOL . '<option value="">' . $translator -> get('None of them') . '</option>' . PHP_EOL ;
  49. foreach ( $arrPHPMethods as $sMethod ) {
  50.  
  51.         if ( isset( $_POST['PHPMethode'] ) and $_POST['PHPMethode'] == $sMethod ) {
  52.                 $selectorPHP .= '<option selected="selected" value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  53.         } else {
  54.                 $selectorPHP .= '<option value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  55.         }
  56. }
  57. $selectorPHP .= '</select>' . PHP_EOL;
  58.  
  59. filter_var( $arrPHPOpenSSLMethods, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
  60. $selectorPHPOpenSSL  = '<legend for="PHPOpenSSLMethode">' . $translator -> get('PHP-openssl_digest() and output translating') . ':</legend><select onchange="clearHash();" id="PHPOpenSSLMethode" name="PHPOpenSSLMethode">' . PHP_EOL . '<option value="">' . $translator -> get('None of them') . '</option>' . PHP_EOL ;
  61. foreach ( $arrPHPOpenSSLMethods as $sMethod ) {
  62.         if ( isset( $_POST['PHPOpenSSLMethode'] ) and $_POST['PHPOpenSSLMethode'] == $sMethod ) {
  63.                 $selectorPHPOpenSSL .= '<option selected="selected" value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  64.         } else {
  65.                 $selectorPHPOpenSSL .= '<option value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  66.         }
  67. }
  68. $selectorPHPOpenSSL .= '</select>' . PHP_EOL;
  69. $outputmethod = '<select onchange="clearHash();" name="outputMethodPHPOpenSSL">
  70. <option value="hex">hexadecimal</option>
  71. ';
  72. if ( isset( $_POST['outputMethodPHPOpenSSL'] ) and $_POST['outputMethodPHPOpenSSL'] == 'base64' ) {
  73.         $PHPOpenSSLbase64 = true;
  74.         $outputmethod .= '<option selected="selected" value="base64">base64</option>';
  75. } else {
  76.         $outputmethod .= '<option value="base64">base64</option>';
  77.         $PHPOpenSSLbase64 = false;
  78. }
  79. $outputmethod .= '
  80. </select>
  81. ';
  82. $selectorPHPOpenSSL .= $outputmethod;
  83.  
  84. if ( $arrUnixSSLMethods ) {
  85.         filter_var( $arrUnixSSLMethods, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
  86.         $selectorUnixOpenSSL  = '<legend for="UnixOpenSSLMethode">' . $translator -> get('Unix-OpenSSL') . ':</legend><select onchange="clearHash();" id="UnixOpenSSLMethode" name="UnixOpenSSLMethode">' . PHP_EOL . '<option value="">' . $translator -> get('None of them') . '</option>' . PHP_EOL ;
  87.         foreach ( $arrUnixSSLMethods as $sMethod ) {
  88.                 if ( isset( $_POST['UnixOpenSSLMethode'] ) and $_POST['UnixOpenSSLMethode'] == $sMethod ) {
  89.                         $selectorUnixOpenSSL .= '<option selected="selected"  value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  90.                 } else {
  91.                         $selectorUnixOpenSSL .= '<option value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  92.                 }
  93.         }
  94.         $selectorUnixOpenSSL .= '</select>' . PHP_EOL;
  95.         $outputmethod = '<select onchange="clearHash();" name="outputMethodUnixOpenSSL">
  96.         <option value="hex">hexadecimal</option>
  97.         ';
  98.         if ( isset( $_POST['outputMethodUnixOpenSSL'] ) and $_POST['outputMethodUnixOpenSSL'] == 'base64' ) {
  99.                 $outputmethod .= '<option selected="selected" value="base64">base64</option>';
  100.                 $UnixOpenSSLbase64 = true;
  101.         } else {
  102.                 $outputmethod .= '<option value="base64">base64</option>';
  103.                 $UnixOpenSSLbase64 = false;
  104.         }
  105.         $outputmethod .= '</select>' . PHP_EOL;
  106.         $selectorUnixOpenSSL .= $outputmethod;
  107. }
  108.  
  109. filter_var( $arrCryptMethods, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
  110. $selectorCrypt  = '<legend for="CryptMethode">' . $translator -> get('PHP-crypt()-methods') . ':</legend><select onchange="clearHash();" id="CryptMethode" name="CryptMethode">' . PHP_EOL . '<option value="">' . $translator -> get('None of them') . '</option>' . PHP_EOL ;
  111. foreach ( $arrCryptMethods as $sMethod ) {
  112.         if ( isset( $_POST['CryptMethode'] ) and $_POST['CryptMethode'] == $sMethod ) {
  113.                 $selectorCrypt .= '<option selected="selected" value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  114.         } else {
  115.                 $selectorCrypt .= '<option value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  116.         }
  117. }
  118. $selectorCrypt .= '</select>' . PHP_EOL;
  119.  
  120. filter_var( $arrOtherMethods, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
  121. $selectorOther  = '<legend for="OtherMethode">' . $translator -> get('Other Methods') . ':</legend><select onchange="clearHash();" id="OtherMethode" name="OtherMethode">' . PHP_EOL . '<option value="">' . $translator -> get('None of them') . '</option>' . PHP_EOL ;
  122. foreach ( $arrOtherMethods as $sMethod ) {
  123.  
  124.         if ( isset( $_POST['OtherMethode'] ) and $_POST['OtherMethode'] == $sMethod ) {
  125.                 $selectorOther .= '<option selected="selected" value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  126.         } else {
  127.                 $selectorOther .= '<option value="' . $sMethod . '">' . $sMethod . '</option>' . PHP_EOL;
  128.         }
  129. }
  130. $selectorOther .= '</select>' . PHP_EOL;
  131.  
  132. if  ( ! empty ( $_POST['PHPMethode'] ) ) {
  133.         if ( isset( $_POST['STRING'] ) and $_POST['STRING'] ) {
  134.                 $string = password_hash($_POST['STRING'], $arrPHPMmethods[$_POST['PHPMethode']] );
  135.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  136.         }
  137. }
  138.  
  139. if ( ! empty ( $_POST['PHPOpenSSLMethode'] ) ) {
  140.         if ( isset( $_POST['STRING'] ) and $_POST['STRING'] ) {
  141.                 if ( $PHPOpenSSLbase64 ) {
  142.                         $string = base64_encode( openssl_digest( $_POST['STRING'], $_POST['PHPOpenSSLMethode'], true ) );
  143.                 } else {
  144.                         $string = openssl_digest( $_POST['STRING'], $_POST['PHPOpenSSLMethode'], false );
  145.                 }
  146.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  147.         }
  148. }
  149.  
  150. if ( ! empty ( $_POST['UnixOpenSSLMethode'] ) ) {
  151.         if ( isset( $_POST['STRING'] ) and $_POST['STRING'] ) {
  152.                 $string = getOpenSSLHash( $_POST['STRING'], $_POST['UnixOpenSSLMethode'], false );
  153.                 if ( $UnixOpenSSLbase64 ) {
  154.                         $string = base64_encode( hex2bin( $string ) );
  155.                 }
  156.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  157.         }
  158. }
  159.  
  160. if ( ! empty( $_POST['CryptMethode'] ) ) {
  161.         if ( isset( $_POST['STRING'] ) and $_POST['STRING'] ) {
  162.                 if ( 'STD_DES' == $_POST['CryptMethode'] ) {
  163.                         $salt = mkSalt( 2 );
  164.                         $string = crypt( $_POST['STRING'], $salt );
  165.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  166.         } elseif ( 'EXT_DES' == $_POST['CryptMethode'] )  {
  167.                         $salt = '_' . mkSalt(8 );
  168.                         $string = crypt( $_POST['STRING'], $salt );
  169.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  170.                 } elseif ( 'MD5' == $_POST['CryptMethode'] )  {
  171.                         $salt = '$1$' . mkSalt( 9 );
  172.                         $string = crypt( $_POST['STRING'], $salt );
  173.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  174.                 } elseif ( 'BLOWFISH-2a' == $_POST['CryptMethode'] )  {
  175.                         $salt = '$2a$10$' . mkSalt();
  176.                         $string = crypt( $_POST['STRING'], $salt );
  177.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  178.                 } elseif ( 'BLOWFISH-2x' == $_POST['CryptMethode'] )  {
  179.                         $salt = '$2x$10$' . mkSalt();
  180.                         $string = crypt( $_POST['STRING'], $salt );
  181.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  182.                 } elseif ( 'BLOWFISH-2y' == $_POST['CryptMethode'] )  {
  183.                         $salt = '$2y$10$' . mkSalt();
  184.                         $string = crypt( $_POST['STRING'], $salt );
  185.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  186.                 } elseif ( 'SHA-256' == $_POST['CryptMethode'] )  {
  187.                         $salt = '$5$rounds=65536$' . mkSalt();
  188.                         $string = crypt( $_POST['STRING'], $salt );
  189.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  190.                 } elseif ( 'SHA-512' == $_POST['CryptMethode'] )  {
  191.                         $salt = '$6$rounds=65536$' . mkSalt(22 );
  192.                         $string = crypt( $_POST['STRING'], $salt );
  193.                 $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  194.                 }
  195.         }
  196. }
  197.  
  198. if ( ! empty( $_POST['OtherMethode'] ) ) {
  199.         if ( isset( $_POST['STRING'] ) and $_POST['STRING'] ) {
  200.                 if ( 'PHP-md5()' == $_POST['OtherMethode'] ) {
  201.                         $string = md5( $_POST['STRING'] );
  202.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  203.                 } elseif ( 'PHP-sha1()' == $_POST['OtherMethode'] ) {
  204.                         $string = sha1( $_POST['STRING'] );
  205.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  206.                 } elseif ( 'Old Unix passwd' == $_POST['OtherMethode'] ) {
  207.                         $sys = "openssl 'passwd' " .  escapeshellarg( $_POST['STRING'] );
  208.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( `$sys` ) . '</output>';
  209.                 } elseif  ( 'Old Unix passwd ($1$)' == $_POST['OtherMethode'] ) {
  210.                         $salt = mkSalt( 3 );
  211.                         $sys = 'openssl passwd -1 -salt ' . escapeshellarg( $salt ) . ' ' . escapeshellarg( $_POST['STRING'] );
  212.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( `$sys` ) . '</output>';
  213.                 } elseif  ( 'Old Apache <= 2.0' == $_POST['OtherMethode'] ) {
  214.                         $h = new APR1_MD5();
  215.                         $string = $h -> hash( $_POST['STRING'] );
  216.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . $string . '</output>';
  217.                 } elseif  ( 'Apache > 2.0' == $_POST['OtherMethode'] ) {
  218.                         $salt = '$2y$05$' . mkSalt();
  219.                         $string = crypt( $_POST['STRING'], $salt );
  220.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  221.                 } elseif  ( 'Old MySQL-passwd()' == $_POST['OtherMethode'] ) {
  222.                         $string = '*' . strtoupper( sha1( sha1( $_POST['OtherMethode'], TRUE ) ) );
  223.                         $output = '<h2>' . $translator -> get('Output') . ':</h2><output id="hash">' . htmlentities( $string ) . '</output>';
  224.                 }
  225.         }
  226. }
  227.  
  228. class APR1_MD5 {
  229.     const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  230.     const APRMD5_ALPHABET = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  231.     // Source/References for core algorithm:
  232.     // http://www.cryptologie.net/article/126/bruteforce-apr1-hashes/
  233.     // http://svn.apache.org/viewvc/apr/apr-util/branches/1.3.x/crypto/apr_md5.c?view=co
  234.     // http://www.php.net/manual/en/function.crypt.php#73619
  235.     // http://httpd.apache.org/docs/2.2/misc/password_encryptions.html
  236.     // Wikipedia
  237.     public static function hash($mdp, $salt = null) {
  238.         if (is_null($salt))
  239.             $salt = self::salt();
  240.         $salt = substr($salt, 0, 8);
  241.         $max = strlen($mdp);
  242.         $context = $mdp.'$apr1$'.$salt;
  243.         $binary = pack('H32', md5($mdp.$salt.$mdp));
  244.         for($i=$max; $i>0; $i-=16)
  245.             $context .= substr($binary, 0, min(16, $i));
  246.         for($i=$max; $i>0; $i>>=1)
  247.             $context .= ($i & 1) ? chr(0) : $mdp[0];
  248.         $binary = pack('H32', md5($context));
  249.         for($i=0; $i<1000; $i++) {
  250.             $new = ($i & 1) ? $mdp : $binary;
  251.             if($i % 3) $new .= $salt;
  252.             if($i % 7) $new .= $mdp;
  253.             $new .= ($i & 1) ? $binary : $mdp;
  254.             $binary = pack('H32', md5($new));
  255.         }
  256.         $hash = '';
  257.         for ($i = 0; $i < 5; $i++) {
  258.             $k = $i+6;
  259.             $j = $i+12;
  260.             if($j == 16) $j = 5;
  261.             $hash = $binary[$i].$binary[$k].$binary[$j].$hash;
  262.         }
  263.         $hash = chr(0).chr(0).$binary[11].$hash;
  264.         $hash = strtr(
  265.             strrev(substr(base64_encode($hash), 2)),
  266.             self::BASE64_ALPHABET,
  267.             self::APRMD5_ALPHABET
  268.         );
  269.         return '$apr1$' . $salt . '$'. $hash;
  270.     }
  271.     // 8 character salts are the best. Don't encourage anything but the best.
  272.     public static function salt() {
  273.         $alphabet = self::APRMD5_ALPHABET;
  274.         $salt = '';
  275.         for($i=0; $i<8; $i++) {
  276.             $offset = hexdec(bin2hex(openssl_random_pseudo_bytes(1))) % 64;
  277.             $salt .= $alphabet[$offset];
  278.         }
  279.         return $salt;
  280.     }
  281. }
  282.  
  283. class i10n {
  284.         private $arr;
  285.         private $lang = 'de';
  286.  
  287.         function __construct() {
  288.  
  289.                 if ( isset( $_COOKIE['lang'] ) ) {
  290.                         $this-> lang = $_COOKIE['lang'];
  291.                 } else {
  292.                         if ( isset ( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
  293.                                 $arTmp = explode( ',' , $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
  294.                                 foreach ( $arTmp as $item ) {
  295.                                         $arLangQuote = array();
  296.                                         $arLangQuote = explode( ';', $item );
  297.                                         if ( ! isset($arLangQuote[1] ) ) {
  298.                                                 $arLangQuote[1] = 1;
  299.                                         }
  300.                                         $arLangQuote[0] = trim( $arLangQuote[0] );
  301.                                         if ( $arLangQuote[0] ) {
  302.                                                 $arT['quote'] = floatval( trim( str_replace( 'q=', '', $arLangQuote[1] ) ) );
  303.                                                 $arT['lang']  = trim( strtolower( $arLangQuote[0] ) );
  304.                                                 $arAcceptedLanguages[] = $arT;
  305.                                         }
  306.                                 }
  307.                                 $quote = 0;
  308.                                 $lang='';
  309.                                 foreach ( $arAcceptedLanguages as $l ) {
  310.                                         if ( $l['quote'] > $quote ) {
  311.                                                 $quote = $l['quote'];
  312.                                                 $lang = $l['lang'];
  313.                                         }
  314.                                 }
  315.                         } else {
  316.                                 $this-> lang = 'en';
  317.                         }
  318.                 }
  319.  
  320.                 $s = 'Password hash generator';
  321.                 $this -> arr[$s]['de'] = 'Passwort-Hash-Generator';
  322.                 $this -> arr[$s]['fr'] = 'Password-hash generateur';
  323.  
  324.                 $s = 'This website contains a comprehensive form. Javascript is required for this to work.';
  325.                 $this -> arr[$s]['de'] = 'Diese Webseite enthält ein umfangreiches Formular. Damit dieses bedienbar ist wird Javascript benötigt.';
  326.                 $this -> arr[$s]['fr'] = 'Ce site contient un formulaire complet. Javascript est requis pour que cela fonctionne.';
  327.  
  328.                 $s='Select your language';
  329.                 $this -> arr[$s]['de'] = 'Wählen Sie Ihre Sprache';
  330.                 $this -> arr[$s]['fr'] = 'Sélectioné votre language';
  331.  
  332.                 $s='Please choose the method first';
  333.                 $this -> arr[$s]['de'] = 'Bitte wählen Sie erst die Methode';
  334.                 $this -> arr[$s]['fr'] = 'S\'il vous plaît choisir la méthode d\'abord';
  335.  
  336.                 $s = 'With this tool you can generate password hashes for different systems. This is useful if you forget a password but can access the appropriate files.';
  337.                 $this -> arr[$s]['de'] = 'Mit diesem Tool können Sie Passwort-Hashes für verschiedene Systeme generieren. Das dann nützlich, wenn man ein Passwort ein vergesssen hat aber auf die passenden Dateien schreiben zugreifen kann.';
  338.                 $this -> arr[$s]['fr'] = 'Avec cet outil, vous pouvez générer des hachages de mots de passe pour différents systèmes. Ceci est utile si vous oubliez un mot de passe mais pouvez accéder aux fichiers appropriés.';
  339.  
  340.                 $s = 'Data protection';
  341.                 $this -> arr[$s]['de'] = 'Datenschutz';
  342.                 $this -> arr[$s]['fr'] = 'Politique de confidentialité';
  343.  
  344.                 $s = 'Your IP address will be stored for a maximum of 2 weeks. A cookie is only set if you choose a language. When the browser is finished it will be forgotten. The data entered by you are processed but not stored at all.';
  345.                 $this -> arr[$s]['de'] = 'Ihre IP-Adresse wird höchstens 2 Wochen gespeichert. Ein Cookie wird nur gesetzt wenn Sie eine Sprache wählen. Bei Beendigung des Browsers wird es vergessen. Die von Ihnen eingegeben Daten werden zwar verarbeitet aber gar nicht gespeichert.';
  346.                 $this -> arr[$s]['fr'] = 'Votre adresse IP sera enregistrée pendant 2 semaines maximum. Un cookie n\'est défini que si vous choisissez une langue. Lorsque le navigateur est terminé, il sera oublié. Les données que vous avez entrées sont traitées mais pas stockées du tout.';
  347.  
  348.                 $s = 'You can also <a href="https://code.fastix.org/Projekte/PHP%3Apassword-hash-generator/">download this script</a> and install it yourself.';
  349.                 $this -> arr[$s]['de'] = 'Sie können <a href="https://code.fastix.org/Projekte/PHP%3Apassword-hash-generator/">dieses Skript auch herunterladen</a> und selbst installieren.';
  350.                 $this -> arr[$s]['fr'] = 'Vous pouvez également <a href="https://code.fastix.org/Projekte/PHP%3Apassword-hash-generator/">télécharger ce script</a> et l\'installer vous-même.';
  351.  
  352.                 $s = 'Select the method';
  353.                 $this -> arr[$s]['de'] = 'Auswahl der Methode';
  354.                 $this -> arr[$s]['fr'] = 'Sélectioné de la méthode';
  355.  
  356.                 $s = 'Selection of the algorithm';
  357.                 $this -> arr[$s]['de'] = 'Auswahl des Algorithmus';
  358.                 $this -> arr[$s]['fr'] = 'Sélection de l\'algorithme';
  359.  
  360.                 $s = 'PHP-password_hash()-methods';
  361.                 $this -> arr[$s]['de'] = 'PHP-password_hash()-Methoden';
  362.                 $this -> arr[$s]['fr'] = 'Le methods de PHP-password_hash()';
  363.  
  364.                 $s = 'PHP-crypt()-methods';
  365.                 $this -> arr[$s]['de'] = 'PHP-crypt()-Methoden';
  366.                 $this -> arr[$s]['fr'] = 'Le methods de PHP-crypt()';
  367.  
  368.                 $s = 'PHP-openssl_digest() and output translating';
  369.                 $this -> arr[$s]['de'] = 'PHP-OpenSSL-Methoden / Ausgabe-Form';
  370.                 $this -> arr[$s]['fr'] = 'Le methods de PHP-OpenSSL et procédé d\'émission';
  371.  
  372.                 $s = 'Unix-openssl_digest() and output translating';
  373.                 $this -> arr[$s]['de'] = 'Unix-OpenSSL-Methoden / Ausgabe-Form';
  374.                 $this -> arr[$s]['fr'] = 'Le methods de Unix-OpenSSL et procédé d\'émission';
  375.  
  376.                 $s = 'Other Methods';
  377.                 $this -> arr[$s]['de'] = 'Andere Methoden';
  378.                 $this -> arr[$s]['fr'] = 'Autres méthodes';
  379.  
  380.                 $s = 'None of them';
  381.                 $this -> arr[$s]['de'] = 'Keine davon';
  382.                 $this -> arr[$s]['fr'] = 'Rien de ça';
  383.  
  384.                 $s = 'Enter the password';
  385.                 $this -> arr[$s]['de'] = 'Eingabe des Passwortes';
  386.                 $this -> arr[$s]['fr'] = 'Entrez le mot de passe';
  387.  
  388.                 $s = 'Password';
  389.                 $this -> arr[$s]['de'] = 'Passwort';
  390.                 $this -> arr[$s]['fr'] = 'Le mot de passe';
  391.  
  392.                 $s = 'Generate';
  393.                 $this -> arr[$s]['de'] = 'Generiere';
  394.                 $this -> arr[$s]['fr'] = 'générer';
  395.  
  396.                 $s = 'Output';
  397.                 $this -> arr[$s]['de'] = 'Ausgabe';
  398.                 $this -> arr[$s]['fr'] = 'Résultat';
  399.  
  400.                 $s = 'Remove all <q>white spaces</q> at begin an end of this string';
  401.                 $this -> arr[$s]['de'] = 'Entferne alle <q>white spaces</q> am Beginn und am Ende';
  402.                 $this -> arr[$s]['fr'] = 'Supprimer tous les <q>espaces blancs</q> au début et à la fin';
  403.     }
  404.  
  405.     public function get( $s ) {
  406.                 if ( isset($this -> arr[ $s ][ $this -> lang ] ) ) {
  407.                     return      $this -> arr[ $s ][ $this -> lang ];
  408.                 } else {
  409.                         return $s;
  410.                 }
  411.         }
  412. }
  413.  
  414. function mksalt($l=22, $s='0123456789abcdefghijklmnopqrstyuvwxyzABCDEFGHIJKLMNOPQRSTYUVWXYZ./') {
  415.                 $salt = '';
  416.                 $len = strlen( $s );
  417.                 for ( $i=0; $i<$l; $i++ ) {
  418.                         $p = random_int( 0, $len - 1 );
  419.                         $salt .= $s{$p};
  420.                 }
  421.                 return $salt;
  422. }
  423.  
  424. function getOpenSSLDigests() {
  425.         $rows = explode("\n", `openssl help 2>&1`);
  426.         $firstLine = false;
  427.         $lastLine  = false;
  428.         for ( $i = 0; $i < sizeof( $rows ); $i++ ) {
  429.                 $row = trim( $rows[$i] );
  430.                 if ( false === $firstLine and false !== strpos( $row,  'Message Digest commands' ) ) {
  431.                         $firstLine = $i + 1;
  432.                 }
  433.                 if ( false != $firstLine and '' == $row ) {
  434.                         $lastLine = $i - 1;
  435.                         break;
  436.                 }
  437.         }
  438.  
  439.         if ( 0 == $firstLine ) return false;
  440.  
  441.         $s = "";
  442.         for ( $i = $firstLine; $i <= $lastLine; $i++ ) {
  443.                 $s .= $rows[$i] . " ";
  444.         }
  445.         $s = preg_replace("/\s+/", "\n" , $s );
  446.     $arr = explode( "\n", trim( $s ) );
  447.  
  448.     return $arr;
  449. }
  450.  
  451. function getOpenSSLHash( $string, $digest ) {
  452.         $sys = 'export LANG=en_US.UTF-8; echo -n ' . escapeshellarg( $string ) . ' | openssl ' . escapeshellarg( $digest );
  453.         return trim( substr(`$sys`, 9 ) );
  454. }
  455.  
  456. function getOldUnixPasswordHash ( $string ) {
  457.     $sys = 'export LANG=en_US.UTF-8; echo ' . escapeshellarg( $string ) . ' | openssl passwd stdin';
  458.     return trim(`$sys`);
  459. }
  460.  
  461. ?><!DOCTYPE html>
  462. <html>
  463. <head>
  464.         <title><?=$translator -> get('Password hash generator'); ?></title>
  465.         <link rel="stylesheet" href="/standard.css" type="text/css">
  466. <style>
  467. #content { padding: 0rem 1rem 0rem 1rem; }
  468. fieldset { margin-bottom:1rem; }
  469. legend   { font-weight:bold; }
  470. output   { border:1px solid black; padding: .5rem; }
  471. #STRING  { width: calc(100% - 3rem); }
  472. #languageSselector { position:absolute;top:.75rem; right:1rem; text-align:right; }
  473. </style>
  474. <script>
  475.  
  476. function fShow(formPart) {
  477.   document.getElementById('selectedMethod').innerHTML=document.getElementById(formPart).innerHTML;
  478.   clearHash();
  479. }
  480.  
  481. function clearHash() {
  482.         if ( document.getElementById('hash') ) {
  483.                 document.getElementById('hash').innerHTML='';
  484.         }
  485. }
  486.  
  487. </script>
  488. </head>
  489. <header>
  490. <h1><?=$translator -> get('Password hash generator'); ?></h1>
  491. </header>
  492. <noscript><strong>Hm. <?=$translator -> get('This website contains a comprehensive form. Javascript is required for this to work.');?></strong></noscript>
  493. <div id="content" style="display:none">
  494. <p><?=$translator -> get('With this tool you can generate password hashes for different systems. This is useful if you forget a password but can access the appropriate files.'); ?></p>
  495. <p><strong><?=$translator -> get('Data protection');?>:</strong> <?=$translator -> get('Your IP address will be stored for a maximum of 2 weeks. A cookie is only set if you choose a language. When the browser is finished it will be forgotten. The data entered by you are processed but not stored at all.');?> <?=$translator -> get('You can also <a href="https://code.fastix.org/Projekte/PHP%3Apassword-hash-generator/">download this script</a> and install it yourself.'); ?></p>
  496. <div id="languageSselector"><?=$translator -> get('Select your language'); ?>:
  497. <button onclick="document.cookie='lang=en'; location.reload()">en</button>
  498. <button onclick="document.cookie='lang=de'; location.reload()">de</button>
  499. <button onclick="document.cookie='lang=fr'; location.reload()">fr</button>
  500. </div>
  501. <h2>1. <?=$translator -> get('Select the method'); ?></h2>
  502. <button onclick="fShow('selectorPHP'); return false"><?=$translator -> get('PHP-password_hash()-methods') ;?></button>
  503. <button onclick="fShow('selectorCrypt'); return false"><?=$translator -> get('PHP-crypt()-methods') ;?></button>
  504. <button onclick="fShow('selectorPHPOpenSSL'); return false"><?=$translator -> get('PHP-openssl_digest() and output translating') ;?></button>
  505. <button onclick="fShow('selectorUnixOpenSSL'); return false"><?=$translator -> get('Unix-openssl_digest() and output translating') ;?></button>
  506. <button onclick="fShow('selectorOthers'); return false"><?=$translator -> get('Other Methods') ;?></button>
  507. <form name="methods" method="POST">
  508. <h2>2. <?=$translator -> get('Selection of the algorithm'); ?>:</h2>
  509.  
  510.  
  511. <fieldset id="selectedMethod">
  512. <?php
  513. if ( isset($_POST['PHPMethode'] ) ) {
  514.         echo $selectorPHP;
  515. } elseif ( isset($_POST['CryptMethode'] ) ) {
  516.         echo $selectorCrypt;
  517. } elseif ( isset($_POST['PHPOpenSSLMethode'] ) ) {
  518.         echo $selectorPHPOpenSSL;
  519. } elseif ( isset($_POST['UnixOpenSSLMethode'] ) ) {
  520.         echo $selectorUnixOpenSSL;
  521. } elseif ( isset($_POST['OtherMethode'] ) ) {
  522.         echo $selectorOther;
  523. } else {
  524.         echo '<p>' . $translator -> get('Please choose the method first') . '</p>';
  525. }
  526. ?>
  527. </fieldset>
  528.  
  529. <h2>3. <?=$translator -> get('Enter the password'); ?>:</h2>
  530. <fieldset>
  531.         <legend for="STRING"><?=$translator -> get('Password'); ?>:</legend>
  532.         <input oninput="clearHash();" onkeydown="clearHash();" onchange="clearHash();" type="text" id="STRING" name="STRING" value="<?=htmlspecialchars( $_POST['STRING'] );?>"><br>
  533. <?php if (! empty( $_POST['trimString'] ) ) { ?>
  534.         <input onchange="clearHash();" type="checkbox" checked="checked" name="trimString"> <?=$translator -> get('Remove all <q>white spaces</q> at begin an end of this string'); ?>
  535. <?php } else { ?>
  536.         <input onchange="clearHash();" type="checkbox" name="trimString"> <?=$translator -> get('Remove all <q>white spaces</q> at begin an end of this string'); ?>
  537. <?php } ?>
  538. </fieldset>
  539. <button><?=$translator -> get('Generate'); ?></button>
  540. <?=$output; ?>
  541. </form>
  542. </div>
  543.  
  544. <form id="hiddenFormParts" style="display:none;">
  545. <div id="selectorPHP">
  546.         <?=$selectorPHP; ?>
  547. </div>
  548.  
  549. <div id="selectorCrypt">
  550.         <?=$selectorCrypt; ?>
  551. </div>
  552.  
  553. <div id="selectorPHPOpenSSL">
  554.         <?=$selectorPHPOpenSSL; ?>
  555. </div>
  556.  
  557. <div id="selectorUnixOpenSSL">
  558.     <?=$selectorUnixOpenSSL; ?>
  559. </div>
  560.  
  561. <div id="selectorOthers">
  562.         <?=$selectorOther; ?>
  563. </div>
  564. </form>
  565.  
  566. </div>
  567. <script>
  568. document.getElementById('content').style.display="block";
  569. </script>
  570. </body>
  571. </html>