Jaki jest dobry sposób na stworzenie losowej "site salt" do wykorzystania w tworzeniu tokenów wyszukiwania haseł?

Chciałbym stworzyć hash dla całej witryny, który będzie używany jako sól w tworzeniu tokenów wyszukiwania haseł. Od dłuższego czasu podskakuję wokół stackoverflow, próbując znaleźć najlepszy sposób, aby to zrobić.

Oto proces resetowania:

Gdy użytkownik zażąda zresetowania hasła, kod generuje Token pobierania:
$token = hash_hmac('sha256', $reset_hash* , $site_hash)

*$reset_hash jest skrótem utworzonym za pomocą funkcji Phpass HashPassword (), zapisanym w tabeli user.

Następnie wysyłam token w adresie URL do użytkowników adres e-mail. Klikają przed upływem czasu żetonu w ciągu godziny. Dopasowuję ich zgłoszenie do tokenu wyzwania generowanego po stronie serwera. Jeśli pasuje, są zmuszeni wybrać nowe hasło, a następnie zalogować się.

Chciałbym wiedzieć, jak najlepiej wygenerować $site_key. Myślę o użyciu innego HMAC hash, który jest zasiany przez losowe liczby:

$site_key = hash_hmac('sha256', MCRYPT_DEV_RANDOM, MCRYPT_DEV_RANDOM);

To daje coś takiego:

98bb403abbe62f5552f03494126a732c3be69b41401673b08cbfefa46d9e8999

Czy będzie to odpowiednio losowe do wykorzystania w tym celu? Am Nie rozumiem tego, czy podchodzę do tego w złą stronę?

Ta odpowiedź zainspirowała mnie do użycia HMAC

EDIT: staram się uniknąć kroku "tajnego pytania" nakłanianego przez niektórych współpracowników, więc chciałbym, aby link resetujący zawierał jeden krok do resetowania hasła. Dlatego obawiam się, że proces ten będzie wystarczająco bezpieczny, aby zabezpieczyć system zawierający poufne informacje.

Rozstrzygnięty, na razie: idę z nonce opisane przez wieżę jako token resetowania. Dziękuję wszystkim za komentarze i opinie.

Author: Community, 2010-07-20

1 answers

Na początek, nie mówisz o soli. Mówisz o kryptograficznej Nonce, a kiedy podajesz hasło, powinieneś użyć Nonce kryptograficznej. W przypadku resetowania haseł powinna to być losowa liczba przechowywana w bazie danych. Nie jest korzystne posiadanie "soli witryny".

Przede wszystkim nie lubię uniqid() ponieważ jest to czas ciężki i Czas jest bardzo słabym ziarnem . rand () vs mt_rand () , spoiler: rand () to totalna bzdura.

W aplikacji webowej dobrym źródłem bezpiecznych tajemnic jest nieblokujący dostęp do puli entropii, takiej jak /dev/urandom. Od wersji PHP 5.3, aplikacje PHP mogą używać openssl_random_pseudo_bytes(), A biblioteka Openssl wybierze najlepsze źródło entropii w oparciu o Twój system operacyjny, pod Linuksem oznacza to, że aplikacja będzie używać /dev/urandom. Ten Code snip od Scotta jest całkiem niezły :

function crypto_rand_secure($min, $max) {
        $range = $max - $min;
        if ($range < 0) return $min; // not so random...
        $log = log($range, 2);
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd >= $range);
        return $min + $rnd;
}

function getToken($length=32){
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    for($i=0;$i<$length;$i++){
        $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
    }
    return $token;
}
 22
Author: rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 19:46:35