Насколько мне известно, если вы говорите о md5
он может хранить до 32 characters
, Я знаю, что если вы превысите 32 characters
он все равно будет хешировать это прекрасно, но на самом деле это может быть hash
как md5( 'a' )
хотя вряд ли.
Разве не потенциально опасно и небезопасно использовать (md5) salt
в md5
или даже не проверяя на input
длина password
+ salt
?
Пример 1:
$pass = md5( 'this is a password' );
$salt = md5( 'this is a salt' );
// Will exceed 32 range and might therefore equal md5( 'a' ) -
// if so this will pass an authorization such as login
md5( $pass . $salt );
Пример 2:
// 32 character password
$pass = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$salt = 'salt';
// Will also exceed 32 range due to no length check and might equal md5( 'a' )
md5( $pass . $salt );
Если вы не делаете:
$pass = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$salt = 'salt';
if ( strlen( $pass ) + strlen( $salt ) > 32 )
exit;
else
md5( $pass . $salt );
Кроме того, где находится предел для sha512
? 512 characters
?
Предисловие:
ни MD5 или SHA-x подходят для хэшей паролей; игнорируя тот факт, что MD5 криптографически взломан и должен быть вообще удален, оба семейства хэшей слишком быстро и не подходят для этой проблемы — это потому, что хэши слишком быстрые, и люди часто выбирают слабый / плохой пароль, который серьезно скомпрометирует домен, что делает пароли MD5 / SHA-x перебором практичными.
Для хеширования пароля используйте Bcrypt вместо (через crypt
), что является стандартным в любой уважающей себя сборке PHP. Другие опции, не входящие в стандартную комплектацию PHP, являются scrypt и даже более уязвимыми PBKDF2.
Лучший нужно не заново изобретать колесо, а использовать существующую / протестированную библиотеку, которая будет использовать действительный алгоритм хеширования (т. е. bcrypt), и решить проблемы с неправильным доступом к базе данных, проверкой подлинности, генерацией соли и т. д. Начиная с PHP 5.5+ password_hash
а также password_verify
Функции могут быть использованы, хотя это все еще только часть системы.
отклик:
выход (диапазон) MD5 — 32 шестнадцатеричных символа, представляющих 128 битов; вход (домен) эффективно неограничен. Для SHA-512 значения составляют 128 символов / 512 бит соответственно. (Обратите внимание, что количество битов эффективной защиты считается Меньше чем фактическое количество бит в диапазоне.)
поскольку ни MD5, ни SHA-x идеальные хэш-функции, то есть будут быть коллизии над доменом, даже если он меньше, чем диапазон — но диапазон настолько велик (а действительный критохэш имеет определенные свойства), что это просто не имеет значения.
То есть результирующие хеши не гарантируются уникальными, а скорее (и особенно с большим количеством битов) крайне невероятно что дубликат будет случайно (или даже умышленно) найден. Ожидаемая частота столкновений может быть оценена День рождения проблема; принцип Pigeon Hole также применяется, но шанс дубликат настолько бесконечно близок к 100% до этого, что не очень применим.
Тем не менее, это не проблема в правильном дизайне. Это потому что криптографические хеш-функции разработаны с определенными свойствами (что также объясняет, почему MD5 неподходящий в такой роли)
Идеальная криптографическая хеш-функция имеет четыре основных свойства:
- легко вычислить значение хеша для любого данного сообщения
- невозможно создать сообщение с заданным хешем
- невозможно изменить сообщение без изменения хеша
- невозможно найти два разных сообщения с одним и тем же хешем
Имейте в виду, что пока еще не было [сообщено] не обнаружено столкновений на SHA-1/2/3. Это потому, что они все еще подходят криптографические хэш-функции. (См. Комментарий Сумерков о SHA-1.)
Также учтите, что есть меньше атомов в наблюдаемой вселенной (10 ^ 80 или ~ 2 ^ 280), чем диапазон хэша SHA-512! Это одна из причин, почему / как криптографические хеш-функции считаются безопасными.
Нет, это не опасно / небезопасно. Нет реального требования безопасности, чтобы два разных пароля не аутентифицировали одинаковые учетные данные! На самом деле у вас может сложиться впечатление, что MD5 будет хэшировать все первые 2 ^ 32-1 значения уникально — на самом деле это не так.
Фактически, MD5 не «хранит» уникальную ценность любого рода. Есть много значений, которые будут хэшироваться на любой данный вывод MD5.
sha2 / 512 имеет, как следует из названия, 512 бит в хэше — вдвое больше длины.