Использование bcrypt: сколько байтов я должен выделить?

Я храню пароли в базе данных SQL, использую PHP и планирую использовать bcrypt.

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

На основе отличного ответа на этот вопрос, кажется, что bcrypt иногда выводит хэши разного размера, возможно, такие большие, как CHAR(76) или BINARY(60). Но я не понимаю, когда и почему.

Этот вопрос содержит ссылку в котором говорится, что использование схемы $2$ дает 59 байт, а $2a$ — 60 байт. Однако сегодняшняя документация для php crypt рекомендует использовать $2y$ вместо $2a$, по какой-то причине из-за к высоким битовым атакам или что-то в этом роде. В любом случае, я хотел бы использовать $2y$, как это рекомендуется, однако нет указаний на размер выводимых файлов.

Каким должен быть размер моих полей в базе данных?

Кроме того, есть ли практическая разница между CHAR и BINARY в такого рода приложениях?


person Bingo    schedule 05.08.2012    source источник
comment
возможный дубликат Хранение хешированного пароля ( Bcrypt) в базе данных — тип/длина столбца?   -  person Andre D    schedule 05.10.2013


Ответы (2)


  1. Хэш: CHAR(60)
  2. Соль: CHAR(22)

Это можно найти экспериментально:

<?php
    $salt1 = "FotZoGZruCl8ugk0Tvl4g";
    $salt2 = "FotZoGZruCl8ugk0Tvl4g9";
    $salt3 = "FotZoGZruCl8ugk0Tvl4g9a";

    print 'Salt 1 (stlen = ' . strlen($salt1) . '): ' . $salt1 . '<br />';
    print 'Salt 2 (stlen = ' . strlen($salt2) . '): ' . $salt2 . '<br />';
    print 'Salt 3 (stlen = ' . strlen($salt3) . '): ' . $salt3 . '<br />';

    $hash1 = crypt('password1', '$2y$07$' . $salt1);
    $hash2 = crypt('password1', '$2y$07$' . $salt2);
    $hash3 = crypt('password1', '$2y$07$' . $salt3);

    print 'Hash 1 (strlen = ' . strlen($hash1) . '): ' . $hash1 . '<br />';
    print 'Hash 2 (strlen = ' . strlen($hash2) . '): ' . $hash2 . '<br />';
    print 'Hash 3 (strlen = ' . strlen($hash3) . '): ' . $hash3 . '<br />';
?>

Вывод будет:

Salt 1 (stlen = 21): FotZoGZruCl8ugk0Tvl4g
Salt 2 (stlen = 22): FotZoGZruCl8ugk0Tvl4g9
Salt 3 (stlen = 23): FotZoGZruCl8ugk0Tvl4g9a
Hash 1 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4g.pXg.UBUUwuj14Ur1d.z/tMLqGPxQLBW
Hash 2 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe
Hash 3 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe

Здесь вы заметите, что если вы добавите к соли более 22 символов, хэш останется неизменным. То есть перед выполнением хеширования crypt урежет соль до 22 символов.

К вашему сведению, случайная генерация соли:

$salt = substr(strtr(base64_encode(mcrypt_create_iv(17, MCRYPT_DEV_URANDOM)), "=+", "./"), 0, 22);

РЕДАКТИРОВАТЬ: Кроме того, формат соли/хэша является базовым 64. То есть с использованием az, AZ, 0-9, '.' и '/' как цифры, каждая цифра представляет значение от 0 до 63... поэтому использование CHAR в базе данных нормально по отношению к BINARY, потому что вы можете представить все эти цифры с помощью CHAR.

person Bingo    schedule 05.08.2012

Он будет такого же размера - 60 символов. (Единственная разница между $2$ и $2a$ заключается в том, что в первом на один символ меньше. Реальная часть хеша имеет тот же размер.)

person Ry-♦    schedule 05.08.2012