Сначала о проблеме хранения паролей ... Так как вы, похоже, используете 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']);