Безопасный процесс токена - PullRequest
2 голосов
/ 28 января 2010

Я сейчас нахожусь в тумане разработки сайта с использованием PHP и MYSQL. Это частный сайт, поэтому регистрация должна быть разрешена с использованием электронной почты. Проще говоря, если новый пользователь должен быть зарегистрирован, администратор должен войти в систему и добавить адрес электронной почты для регистрации.

Что я хочу сделать, так это создать токен или значение прохода, когда это произойдет.

Вот шаги:

  1. Администратор добавляет электронное письмо в систему
  2. Создается уникальное значение токена (например, 1234567890)
  3. Значение токена затем отправляется на электронную почту пользователя
  4. пользователь переходит по указанной ссылке и вводит свой адрес электронной почты и значение токена
  5. В случае успеха - пользователю разрешено зарегистрироваться
  6. Если не получится! - Токен регенерируется и отправляется снова на этот адрес электронной почты

Что я действительно хочу знать, так это то, что было бы лучшим способом создания токена и как мы можем обеспечить создание уникального токена при каждой регистрации электронного письма.

Для обеспечения дополнительной безопасности я могу гарантировать, что каждый токен будет работать только пару часов. Но предотвратит ли это несанкционированный доступ в систему, или это плохая идея для защиты моего сайта?

Мои мысли о создании уникального токена: используйте алгоритмы хеширования, использующие SALT, чтобы результаты не могли быть предсказаны или расшифрованы (проблемы с MD5)

Любая помощь или направление в правильном направлении было бы замечательно.

1 Ответ

4 голосов
/ 28 января 2010

Мне нравится этот метод генерации криптографически безопасного генератора псевдослучайных чисел или (CSPRNG) для PHP. Это было написано Скоттом :

<?php
   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;
}
?>

Что касается добавления тайм-аута, я рекомендую позаботиться об этом в базе данных. Добавьте столбец, который вызывается как registration_timeout, а затем используйте функцию addq () mysql, чтобы установить для этого столбца текущую отметку времени + сколько бы времени вы не хотели, чтобы время ожидания было.

Также имейте в виду, что временные учетные записи электронной почты тривиальны в использовании (http://www.mailinator.com, http://www.guerrillamail.com, и т. Д.), Поэтому запрос кого-либо о регистрации учетной записи электронной почты ничего не значит. Более того, учетная запись пользователя может оказаться на http://www.bugmenot.com.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...