Сравнение точности пароля и имени пользователя: utf8_general_ci или utf8_bin?

Я прочитал здесь сообщение о том, что 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);
}

person laukok    schedule 24.01.2011    source источник
comment
вы должны хранить свои пароли как соленый хеш. бонус: с хешами вам не нужно беспокоиться о юникоде (только [a-f0-9])   -  person knittl    schedule 24.01.2011
comment
@knittl: да, я хешировал все свои пароли. благодаря.   -  person laukok    schedule 24.01.2011
comment
@lauthiamkok: Какой формат у хешированного значения?   -  person Gumbo    schedule 24.01.2011
comment
@knittl: В мире, где аренда дешевого экземпляра AWS для создания быстрых радужных таблиц, соленые хэши sha1() не принесут вам много пользы. sha1() просто слишком быстрый алгоритм.   -  person Andrew Moore    schedule 24.01.2011
comment
@andrew: все же лучше, чем не солить или вообще не перемешивать ...   -  person knittl    schedule 24.01.2011
comment
@ Gumbo ♦: значение хеширования, которое у меня обычно бывает таким: 1ac5694de74e0b2b9c16df2039d8b316a62fd36cdc3b58a2f7df2a1c63f91cdf3f926f6203fb1125f877cb3588eea2358816957d2caf8caf9   -  person laukok    schedule 24.01.2011
comment
@lauthiamkok: Значит, это шестнадцатеричное представление.   -  person Gumbo    schedule 24.01.2011
comment
@ Gumbo ♦: проблемы с шестнадцатеричным представлением?   -  person laukok    schedule 24.01.2011
comment
@lauthiamkok: Нет, не в целом. Вам просто нужно позаботиться о регистре букв, поскольку это зависит от сопоставления, _1 _ = _ 2_ или нет. В последнем случае следует использовать либо прописные, либо строчные буквы. Вы также можете использовать основание, отличное от шестнадцатеричного (основание 16), например двоичное представление (основание 256).   -  person Gumbo    schedule 24.01.2011
comment
@ Гамбо ♦: спасибо. что я могу сделать, если я хочу использовать двоичное представление (база 256), любые существующие сообщения здесь, к которым я могу перейти?   -  person laukok    schedule 24.01.2011
comment
@lauthiamkok: PHP sha1 делает это, задав для второго параметра значение true. Но тогда вам нужен соответствующий двоично-безопасный тип данных. См. Хранение хеш-значений SHA1 в MySQL.   -  person Gumbo    schedule 24.01.2011
comment
@ Гамбо ♦: спасибо. Я использую sha512, как в моем редактировании выше. Я думал, что где-то читал, что sha512 теперь безопаснее sha1?   -  person laukok    schedule 24.01.2011
comment
@lauthiamkok: у sha512() та же проблема, что и у sha1(). Это слишком быстро для использования в контексте безопасности. НЕ ПЫТАЙТЕСЬ РЕШИТЬ КРИПТОЛОГИЮ САМОСТОЯТЕЛЬНО. Доверьтесь экспертам в этой области и используйте PHP-фреймворк для хеширования паролей ... Он использует bcrypt и безопасен СЕГОДНЯ ... и будет в безопасности ЗАВТРА (с большим количеством раундов).   -  person Andrew Moore    schedule 24.01.2011
comment
@ Эндрю Мур: спасибо. Я только что получил эту загрузку и собираюсь попытаться интегрироваться со своим сайтом :-)   -  person laukok    schedule 24.01.2011


Ответы (2)


Сначала о проблеме хранения паролей ... Поскольку вы, похоже, используете 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']);
person Andrew Moore    schedule 24.01.2011
comment
Разве в utf8 не указано, что для любого символа должна быть только одна допустимая кодировка? - person knittl; 24.01.2011
comment
@knittl: é é ... Один и тот же символ, два разных способа его записи ... Некоторые символы могут быть выражены либо в его нормализованной форме, либо в базовой форме, а также в сочетании диакритических знаков. См. UAX # 15: формы нормализации Unicode. - person Andrew Moore; 24.01.2011
comment
@ Эндрю Мур: спасибо за этот ответ. могу я спросить - что здесь значит «нормализовать»? зачем нам нормализовать логин? - person laukok; 24.01.2011
comment
@ Эндрю Мур: да, я использую PHP ... :-) - person laukok; 24.01.2011
comment
@andrew: на моем экране два персонажа выглядят по-разному, но я понимаю вашу точку зрения. использование одинарных символов вместо комбинирования символов с их акцентами. Спасибо за разъяснения - person knittl; 24.01.2011
comment
@leuthiamkok: UAX № 15: формы нормализации Unicode точно объясняет, что такое нормализация UTF-8. Для любых символов, которые не являются частью обычного алфавита США, существует несколько способов представления одного символа. В зависимости от ОС вы получите один и тот же текст, представленный по-разному. Нормализация UTF-8, что один и тот же текст всегда отображается одинаково. - person Andrew Moore; 24.01.2011
comment
@ Эндрю Мур: спасибо. на моем сервере работает php 5.1xx, поэтому я не могу использовать Normalizer :: normalize ... - person laukok; 24.01.2011
comment
@lauthiamkok: Вы все еще можете .. Просто скомпилируйте расширение intl. - person Andrew Moore; 24.01.2011
comment
@ Эндрю Мур: еще раз извините - "компилировать"? У меня нет сервера, как мне скомпилировать расширение intl? благодаря. - person laukok; 24.01.2011
comment
@lauthiamkok: Значит, у вас неприятная ситуация. Если вы не можете нормализовать строки UTF-8, которые вам нужно сравнить после, ограничьте их обычными буквенно-цифровыми последовательностями ... Я лично настаиваю на обновлении до PHP 5.3 ... Спросите своего провайдера. - person Andrew Moore; 24.01.2011
comment
@ Эндрю Мур: провайдер сервера раздражает. ищите современный и актуальный сервер прямо сейчас! Спасибо за совет :-) - person laukok; 24.01.2011

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

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

person OMG Ponies    schedule 24.01.2011