Сравнение точности для пароля и имени пользователя: utf8_general_ci или utf8_bin? - PullRequest
0 голосов
/ 24 января 2011

Я прочитал здесь пост, что utf8_bin дает нам большую точность при сравнении символов, в то время как utf8_general_ci нет.

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

Тогда я должен использовать utf8_bin для этой цели?

Спасибо.

РЕДАКТИРОВАТЬ:

Ккстати, это хеш-функция, которую я использую, чтобы иметь пароль,

function hash_sha512($phrase,&$salt = null)
{
    //$pepper = '!@#$%^&*()_+=-{}][;";/?<>.,';

    if ($salt == '')
    {
        $salt = substr(hash('sha512',uniqid(rand(), true).PEPPER_KEY.microtime()), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return hash('sha512',$salt.PEPPER_KEY.$phrase);
}

Ответы [ 2 ]

1 голос
/ 24 января 2011

Сначала о проблеме хранения паролей ... Так как вы, похоже, используете PHP (из истории ваших вопросов) ... Соленые хеши sha1() просто не уменьшат его в мире, где аренда нескольких экземпляров AWS длявычислять быстрые радужные таблицы ... sha1() слишком быстро.

Вместо того, чтобы попробовать свои силы в криптологии "сделай сам", почему бы не доверять библиотекам, созданным настоящими экспертами в этой области?Используйте Portable PHP хэширование паролей .

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

Использовать это просто:

require('PasswordHash.php');

$phpass = new PasswordHash(12, false); // Initiate for 12 rounds, using bcrypt

// Hash a password
$hash = $phpass->HashPassword('my secret password');

// Compare an hash to a given password
$formSupplied = 'hello world';
$isRight = $phpass->CheckPassword($formSupplied, $hash);

if($isRight) echo "Good";
else echo "Wrong";

Теперь по поводу имен пользователей ... Храните их, используя _bin сопоставление (т.е.: utf8_bin).Это заставит MySQL выполнять двоичное сравнение, когда в течение WHERE, и эффективно делает ваши имена пользователей чувствительными к регистру.

ОДНАКО, поскольку это UTF-8, важно будет нормализовать имя пользователя перед вставкой изапрашивая ваши данные.Различные операционные системы представляют акцентированные символы по-разному.PHP имеет расширение intl, которое имеет средства для нормализации UTF-8.Следующее должно сделать:

$_POST['username'] = Normalizer::normalize($_POST['username']);
1 голос
/ 24 января 2011

Вы говорите о сопоставлении - это символы, которые будет поддерживать таблица MySQL.«_Ci» в сопоставлении указывает, что сопоставление нечувствительно к регистру.Значение «a» == «A», в то время как в сопоставлении с учетом регистра пример оценивается как ложное.

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

...