А давайте я вам расскажу сказу-быль об одном интернет-провайдере?
Жил-был, значится, один интернет-провайдер, и был у него биллинг, а данные биллинга жили в базе, в Постгресе. Но сказка не о Постгресе, об этом как-нибудь потом.
И вот в этой самой базе хранились все клиентские пароли. Так как разработчики были не полными идиотами, пароли они хэшировали. И на момент написания биллинга хэш-функция считалась надежной. Вот беда - было это 10 лет назад. А вторая беда - так, не беда - бедулька, я бы даже сказал; в общем, так - бедулечка, и была она в том, что пароль генерировался предсказуемым образом: одна цифра и только строчные буквы от a до z; длина 12 октетов. При этом в пароле никогда не встречалось две и более гласных или согласных подряд. От чего количество переборов исчислялось не квинтиллионами (10^18), как могло бы быть, а всего лишь сотней-другой миллиардов.
В общем, был хэш от пароля, а стал пароль в плейнтексте. Потому что с тех времен, когда что-то там считалось надежным, прошло много времени, по крайней мере, этого времени было достаточно чтобы вычислительная мощность компьютерыов выросла настолько, что перебор пароля стал реальным без применения ресурсов АНБ.
И самое печальное - что поменять алгоритм не переписывая кучу кода нельзя - обязательно что-то да отвалится. Ну, вы и сами всё про большие системы знаете.
В этой сказке-были есть мораль:
1) Не используйте MD5 НИГДЕ. Ни с солью, ни без.
2) Не используйте алгоритмов, не допускающих конфигурируемого усложнения хэша.
3) Прежде чем писать генератор пароля, прикиньте количество возможных вариантов. Потому что [a-z0-9] длиной 12 байт === 36^12 == 4.73e+18. А пароль с чередующимися гласными и согласными и одной цифрой == 5^5 * 21 ^ 6 * 10 = 1.27e+11.
4) Прежде чем писать код, осильте, наконец,
https://ru.wikipedia.org/wiki/PBKDF2