Алгоритм, лежащий в основе MD5Crypt
Вопрос
Я работаю с Subversion на базе Windows и хотел бы написать простую утилиту на .NET для работы с файлом паролей Apache.Я понимаю, что он использует функцию, называемую MD5Crypt, но, похоже, я не могу найти описания алгоритма, кроме того, что в какой-то момент он использует MD5 для создания хэша.
Кто-нибудь может описать алгоритм MD5Crypt и формат строки пароля?
Решение
Точное текстовое описание алгоритма шифрования, обновленного для использования с sha256 и sha512, находится по адресу http://www.akkadia.org/drepper/SHA-crypt.txt
Он включает в себя контрасты с алгоритмом MD5, поэтому он должен дать вам то, что вы ищете.
Другие советы
Вы можете найти реализацию md5crypt в пакет tcllib. Загрузка доступна с сайта кузница- источник.
Вы также можете найти пример md5crypt, совместимого с apache, в исходный код для универсального обработчика CAS
MD5Crypt - это, по сути, замена старомодной функции unix crypt.Он был представлен во freebsd, а также был принят другими группами.
Основная идея заключается в следующем:
- хэш - это хороший способ хранения пароля
- вы берете введенный пользователем пароль и хэшируете его
- сравните его с сохраненным хэшем
- если хэш один и тот же, пароли совпадают
Но есть одна проблема:
- Предположим, вы выбираете пароль "Джефф", и я также выбираю пароль "джефф".
- Теперь оба наших хэша паролей одинаковы.
- Поэтому, если я увижу сохраненные хэш-коды, я буду знать, что ваш пароль такой же, как у меня, "Джефф".
Итак, мы можем добавить к паролю строку "соль".
- Это может быть любая случайная вещь.
- Предположим, для вашей учетной записи это "zuzu", а для моей учетной записи это "rjrj".
- Теперь мы хэшируем строку "jeffzuzu" для вашего пароля и "jeffrjrj" для моего пароля.
- Теперь у нас есть разные хэш-значения для нашего пароля.
- Мы можем безопасно сохранить значение salt вместе с хэшированным паролем, поскольку даже знание значения salt не поможет расшифровать хэш.
Вы упоминаете .net, на другом форуме есть указатель на это:
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new
System.Security.Cryptography.MD5CryptoServiceProvider();
string hash =BitConverter.ToString((md5.ComputeHash(
System.Text.ASCIIEncoding.Default.GetBytes(stringtohash) ) ));
ХТХ!
Этот процесс довольно сложный...соль и пароль хэшируются вместе не один раз, а 1000 раз.Кроме того, кодировка base64 использует другой алфавит, и отступы удалены с конца.
Вероятно, лучше всего было бы найти библиотеку для использования, например glibc под cygwin.
Поскольку вы все равно пишете код против Apache, взгляните на Реализация Apache из крипты-md5.
Оригинальный алгоритм (я думаю) на языке Си можно найти здесь.Он отличается от приведенной выше реализации только другим магическим числом.