Во-первых, некоторые важные термины:
Хеширование - процесс взятия строки и создания последовательности символов, которую нельзя вернуть к исходной строке.
Симметричное шифрование - (обычно именуемое просто «шифрованием») - действие по взятию строки и созданию последовательности символов, которая может быть расшифрована до исходной строки с использованием того же ключа шифрования, который ее зашифровал.
Rainbow Table - справочная таблица, которая содержит все варианты символов, хешированных с помощью определенного алгоритма хеширования.
Поваренная соль - известная случайная строка, добавляемая к исходной строке перед ее хешированием.
Для .NET Framework Bcrypt еще не имеет проверенной эталонной реализации. Это важно, потому что невозможно узнать, есть ли серьезные недостатки в существующей реализации. Вы можете получить реализацию BCrypt для .NET здесь . Я не знаю достаточно о криптографии, чтобы сказать, хорошая это реализация или плохая. Криптография - очень глубокая область. Не пытайтесь создать свой собственный алгоритм шифрования . Шутки в сторону.
Если вы собираетесь реализовать собственную защиту паролем (вздох), вам нужно сделать несколько вещей:
- Используйте относительно безопасный алгоритм хеширования .
- Соли каждый пароль перед хешированием.
- Используйте уникальную длинную соль для каждого пароля и сохраните соль вместе с паролем.
- Требовать надежные пароли .
К сожалению, даже если вы сделаете все это, целеустремленный хакер все равно сможет вычислить пароли, это займет у него очень много времени. Это ваш главный враг: время .
Bcrypt алгоритм работает , потому что она занимает пять порядков больше , чтобы хэш пароля , чем MD5 ; (и все еще намного длиннее, чем AES или SHA-512). Это заставляет хакера тратить намного больше времени на создание радужной таблицы для поиска ваших паролей, что значительно снижает вероятность того, что ваши пароли будут под угрозой взлома.
Если вы солите и хешируете свои пароли, и каждая соль отличается, тогда потенциальному хакеру придется создать радужную таблицу для каждого варианта соли , просто чтобы иметь радужную таблицу для одного соленого + хешированного пароля. Это означает, что если у вас 1 миллион пользователей, хакер должен создать 1 миллион радужных таблиц. Если вы используете одну и ту же соль для каждого пользователя, то хакеру достаточно создать только одну радужную таблицу, чтобы успешно взломать вашу систему.
Если вы не солите свои пароли, то все, что нужно сделать злоумышленнику, - это открыть существующую таблицу Rainbow для каждой реализации (AES, SHA-512, MD5) и просто посмотреть, соответствует ли она хешу. Это уже сделано , злоумышленнику не нужно вычислять эти таблицы Rainbow самостоятельно .
Даже несмотря на все это, вы должны использовать хорошие методы безопасности . Если они могут успешно использовать другой вектор атаки (XSS, SQL-инъекция, CSRF и др. ) На вашем сайте, хорошая защита паролем не имеет значения. Это звучит как спорное утверждение, но думать об этом: Если я могу получить всю вашу информацию пользователя через инъекцию SQL атаку, или я могу получить ваши пользователь , чтобы дать мне свои кук через XSS, то это не имеет значения , насколько хорошо ваш пароль безопасность есть .
Другие источники:
- Джефф Этвуд: .NET Encryption Simplified (отлично подходит для обзора хеширования)
- Джефф Этвуд: Я только что вошел в систему как вы
- Джефф Этвуд: Вы, вероятно, неправильно храните пароли
- Джефф Этвуд: скорость хеширования
Примечание. Порекомендуйте другие хорошие ресурсы. Я, должно быть, прочитал дюжину статей десятков авторов, но немногие пишут на эту тему так ясно, как Джефф. Пожалуйста, редактируйте статьи по мере их нахождения.