"Идеальная" функция хеширования пароля на данный момент - bcrypt .Он включает в себя обработку соли и настраиваемое количество итераций.Существует бесплатная реализация PHP с открытым исходным кодом .
Вторым лучшим вариантом будет PBKDF2 , который опирается на базовую хеш-функцию и чем-то напоминает то, что вы предлагаете.Есть технических причин , почему bcrypt "лучше", чем PBKDF2.
Что касается ваших конкретных вопросов:
1.Было бы полезно включить имя пользователя в соли?
Не совсем.
2.Я решил использовать поваренную соль для всех пользователей, есть ли в этом недостаток?
Да: это устраняет преимущества наличия соли.Единственная причина существования - быть уникальным для каждого хешированного пароля.Это позволяет атакующему атаковать два хэшированных пароля с меньшими усилиями, чем в два раза, чем атака одного хэшированного пароляСоли должны быть уникальными .Даже наличие соли для пользователя плохо: соль также должна быть изменена, когда пользователь меняет свой пароль.Оптимизация, которую злоумышленник может применить при повторном использовании / совместном использовании соли, включает (но не ограничивается) таблицы предварительно вычисленных хешей, такие как радужные таблицы .
3,Какова рекомендуемая минимальная длина соли, если таковая имеется?
Соль должна быть уникальной.Уникальность - сложное свойство поддерживать.Но используя достаточно длинных случайных солей (генерируемых хорошим генератором случайных чисел, предпочтительно криптографически сильным), вы получаете уникальность с достаточно высокой вероятностью.128-битные соли достаточно длинные.
4.я должен использовать MD5, Sha или что-то еще?
MD5 плохо для связей с общественностью.У него есть известные недостатки, которые могут или не могут применяться к данному использованию, и очень трудно с какой-либо достоверностью «доказать», что эти недостатки не относятся к конкретной ситуации.SHA-1 лучше, но не «хорошо», потому что он также имеет слабые стороны, хотя и гораздо менее серьезные, чем у MD5.SHA-256 - разумный выбор.Как было указано выше, для хеширования пароля вам нужна функция, которая хорошо не хорошо масштабируется на параллельных архитектурах, таких как GPU , а SHA-256 хорошо масштабируется, поэтому Blowfish-производное, используемое в bcrypt, является предпочтительным.
5.Что-то не так с приведенным выше алгоритмом / какие-либо предложения?
Это домашнее.Это плохо.Проблема в том, что не существует известного теста на безопасность криптографического алгоритма.Лучшее, на что мы можем надеяться, это позволить нескольким сотням профессиональных криптографов попытаться взломать алгоритм в течение нескольких лет - если они не могут, то мы можем сказать, что хотя алгоритм на самом деле не «доказан» как безопасный, по крайней мере, слабые стороныне должно быть очевидным.Bcrypt был вокруг, широко развернут и проанализирован в течение 12 лет.Вы не можете победить это самостоятельно, даже с помощью StackOverflow.
Как профессиональный криптограф, я бы поднял подозрительную бровь при использовании простой конкатенации в MD5 или даже SHA-256: это Merkle – Damgård хеш-функции, которая хороша для сопротивления столкновению, но не обеспечивает случайного оракула (существует так называемая «атака с удлинением длины»).В PBKDF2 хеш-функция используется не напрямую, а через HMAC .