как же создать пароль для htpasswd средствами php?

Discussion in 'PHP' started by Дикс, 11 Jul 2010.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    исходя из того, что в "помощи новичкам" никто не смог дать ответа, на злом и кроссплатформе тоже никто ничего не знает, гугл предлагает варианты, которые просто-напросто не работают - делаю вывод что вопрос этот очень важен не только для меня.

    давайте же найдем решение вместе.

    заготовка для теста:
    PHP:
    <?php   

    if($_POST)   
    {   
        
    $text trim($_POST['pass']);   

        
    $pass crypt($textbase64_encode($text));    // здесь !!

        
    file_put_contents('./.htpasswd'trim($_POST['login']).':'$pass);   

        
    $access '<Files .htpasswd>   
       deny from all   
    </Files>   

    AuthType Basic   
    AuthName "Restricted Area"   
    AuthUserFile ' 
    .getcwd(). '/.htpasswd   
    Require valid-user'
    ;   

        
    file_put_contents('./.htaccess'$access);   

        echo 
    '<b>done.</b> <br /><br />';   

    }   

    ?><form method='post'>   
    login: <input type='text' name='login' /><br />   
    pass: <input type='text' name='pass' /><br />   
    <input type='submit' value='create pass' /></form>
    Варианты кодирования от гугла:

    1

    $salt=substr($pass,0,2);
    $test_pw=crypt($pass,$salt);

    2

    $password = crypt($pass, base64_encode($pass));

    3

    $pass = crypt($pass, base64_encode(CRYPT_STD_DES))


    Ни один способ не работает, кроме варианта с некодированным паролем. Но он в свою очередь работает только на винде.

    Проверено на винде xp, apache 2.2, php 5.2.13

    Нюанс: если сгенерить htpasswd онлайн-генератором типа этого
    http://www.htaccesstools.com/htpasswd-generator/
    всё авторизуется нормально и на винде и на юникс-сервере.
     
  2. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,248
    Likes Received:
    1,148
    Reputations:
    886
    легче некуда )) а вот почему base64?
     
    _________________________
  3. shellz[21h]

    shellz[21h] Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    311
    Likes Received:
    68
    Reputations:
    6
    этот сервис использует MD5 хеширование, а DES.
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Дикс из мана по ПХП. Работает и на винде и на линуксе (CentOS Apache/2.2.3
    ) Генерацию соли лучше исправить на свою
    PHP:
    function crypt_apr1_md5($plainpasswd) {
        
    $salt substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 08);
        
    $len strlen($plainpasswd);
        
    $text $plainpasswd.'$apr1$'.$salt;
        
    $bin pack("H32"md5($plainpasswd.$salt.$plainpasswd));
        for(
    $i $len$i 0$i -= 16) { $text .= substr($bin0min(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;
    }
     
    _________________________
    1 person likes this.
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    жесть, я так и знал
    как раз подсказали что это MD5 (ARP)

    UPD: работает!
     
    #5 Дикс, 11 Jul 2010
    Last edited: 11 Jul 2010