Это перебор? Динамическое солевое шифрование для шифрования паролей Whirlpool

Я думаю, что, возможно, сгенерировал немного избыточной соли, когда дело доходит до шифрования паролей в джакузи.

Это то, что делает код генерации соли, шаг за шагом

  1. Генерируется псевдослучайная строка длиной 10, которая имеет следующие возможные значения:

    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

  2. Действительно случайное число от -2 до 123 генерируется атмосферным шумом

  3. Эта псевдослучайная строка и полностью случайное число перемешиваются вместе с меткой времени Unix.
  4. Эта предварительная соль затем шифруется с помощью md5.

Это просто поколение соли, у меня тоже все это зашифровано в джакузи

hash( 'whirlpool',$salt.$password);

Есть ли уязвимость в моем коде? Должен ли я md5 хешировать значения до их объединения или после?

Вот мой код, чтобы проверить...

<?php
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

function get_true_random_number($min = 1, $max = 100) {
    $max = ((int) $max >= 1) ? (int) $max : 100;
    $min = ((int) $min < $max) ? (int) $min : 1;
    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER => false,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_ENCODING => '',
        CURLOPT_USERAGENT => 'PHP',
        CURLOPT_AUTOREFERER => true,
        CURLOPT_CONNECTTIMEOUT => 120,
        CURLOPT_TIMEOUT => 120,
        CURLOPT_MAXREDIRS => 10,
    );

    $ch = curl_init('http://www.random.org/integers/?num=1&min='
        . $min . '&max=' . $max . '&col=1&base=10&format=plain&rnd=new');
    curl_setopt_array($ch, $options);
    $content = curl_exec($ch);
    curl_close($ch);

    if(is_numeric($content)) {
        return trim($content);
    } else {
        return rand(-10,127); //INCASE RANDOM.ORG returns a server busy error
    }
}

function generateSalt() {
    $string = generateRandomString(10);
    $int = get_true_random_number(-2,123);
    $shuffled_mixture = str_shuffle(Time().$int.$string);
    return $salt = md5($shuffled_mixture);
}

echo generateSalt();
?>

Кроме того, как долго должна быть соль? Лично я не думаю, что хэширование, это другие типы персонажей, имеет значение настолько просто, потому что никто не делает грубую соль, я не думаю. Это все! Заранее спасибо. Кроме того, любой лучший или более эффективный метод будет полезен.

2 ответа

Решение

Общее руководство по криптографии: никогда не пишите свой собственный криптограф! Это включает в себя создание собственных алгоритмов и реализацию публично проверенных систем. Это слишком сложно, чтобы получить права (даже для экспертов).

Начиная с PHP 5.5, существует очень простой и надежный API, который вы должны использовать для хеширования паролей: password_hash () и password_verify()


Теперь о вашей реализации и алгоритме:

Вы беспокоитесь о неправильных аспектах вашего алгоритма хеширования паролей. Соль, которую вы используете, не должна включать в себя сверхвысокие значения энтропии, и даже эти значения можно собирать гораздо более простым способом (например, если вы работаете в Linux, прочитайте 32 байта из /dev/urandom).

Вместо этого вам следует беспокоиться о том, насколько трудно взломать пароль, учитывая соль и хеш (сценарий взлома базы данных). Это фактически означает хеширование всех вероятных паролей с сохраненной солью и сравнение его с сохраненным ссылочным хешем. Чтобы замедлить злоумышленника, вы хотите использовать медленную хеш-функцию, чтобы предотвратить множество сравнений паролей. Примером может быть хеширование полученного хеша снова и снова (несколько тысяч раз).

Соль защищает от атак радужных таблиц, где огромные предварительно вычисленные базы данных могут запрашивать исходный хеш. Вы (успешно) предотвращаете этот вектор атаки, рандомизируя хеш-функцию через соль.

Мигель Ибарра Ромеро предлагает отличную статью по этому вопросу:

Риски и проблемы хеширования паролей

Он утверждает, что соли должны быть длиной 64 символа, чтобы предотвратить атаки грубой силы.

С точки зрения реализации: я настоятельно рекомендую не использовать источник истинных случайных чисел, над которым у вас нет физического контроля. Получение случайных чисел с чужого веб-сайта, каким бы удобным оно ни было, не является надежной практикой безопасности. Вы не знаете с криптографической надежностью, откуда взялись эти цифры, как они были получены, насколько они предвзяты, и есть ли записи о том, что вы их получили.

Другие вопросы по тегам