Я хотел бы сохранить хэш пароля на телефоне, но не знаю, как это сделать. Я могу только найти методы шифрования. Как правильно хешировать пароль?
117
ОБНОВЛЕНИЕ : ЭТОТ ОТВЕТ СЕРЬЕЗНО УСТАРЕЛ . Вместо этого используйте рекомендации https://stackoverflow.com/a/10402129/251311 .
Вы можете использовать
var md5 = new MD5CryptoServiceProvider();
var md5data = md5.ComputeHash(data);
или
var sha1 = new SHA1CryptoServiceProvider();
var sha1data = sha1.ComputeHash(data);
Чтобы получить data
массив байтов, вы можете использовать
var data = Encoding.ASCII.GetBytes(password);
и вернуть строку из md5data
илиsha1data
var hashedPassword = ASCIIEncoding.GetString(md5data);
using
оператор или вызываетеClear()
его, когда закончите использовать реализацию.md5
достаточно хорош для почти всех задач. Его уязвимости также относятся к очень специфическим ситуациям и почти требуют, чтобы злоумышленник много знал о криптографии.Большинство других ответов здесь несколько устарели с сегодняшней передовой практикой. Таким образом, вот приложение использования PBKDF2 /
Rfc2898DeriveBytes
для хранения и проверки паролей. Следующий код находится в отдельном классе в этом посте: Еще один пример того, как хранить соленый хэш пароля . Основы действительно просты, поэтому вот они:ШАГ 1 Создайте значение соли с криптографическим ГПСЧ:
ШАГ 2 Создайте Rfc2898DeriveBytes и получите значение хеш-функции:
ШАГ 3 Объедините байты соли и пароля для дальнейшего использования:
ШАГ 4 Превратите объединенную соль + хеш в строку для хранения
ШАГ 5 Сравните введенный пользователем пароль с сохраненным паролем.
Примечание. В зависимости от требований к производительности вашего конкретного приложения это значение
100000
может быть уменьшено. Минимальное значение должно быть около10000
.источник
Основываясь на отличном ответе csharptest.net , я написал для этого класс:
Использование:
Примерный хеш может быть таким:
Как видите, я также включил итерации в хэш для удобства использования и возможности обновить его, если нам потребуется обновление.
Если вас интересует ядро .net, у меня также есть версия ядра .net на Code Review .
источник
V1
иV2
какой метод вам нужно подтверждение.Я использую хеш и соль для шифрования моего пароля (это тот же хеш, что и в Asp.Net Membership):
источник
источник
Я думаю, что использование KeyDerivation.Pbkdf2 лучше, чем Rfc2898DeriveBytes.
Пример и объяснение: хеш-пароли в ASP.NET Core
Это пример кода из статьи. И это минимальный уровень безопасности. Чтобы увеличить его, я бы использовал вместо параметра KeyDerivationPrf.HMACSHA1
KeyDerivationPrf.HMACSHA256 или KeyDerivationPrf.HMACSHA512.
Не идите на компромисс с хешированием паролей. Существует множество математически обоснованных методов оптимизации взлома паролей. Последствия могут быть катастрофическими. Как только злоумышленник сможет получить доступ к хэш-таблице паролей ваших пользователей, ему будет относительно легко взломать пароли, учитывая слабый алгоритм или неправильную реализацию. У него много времени (время х мощность компьютера), чтобы взломать пароли. Хеширование паролей должно быть криптографически надежным, чтобы превратить «много времени» в « необоснованное количество времени». ».
Еще один момент, чтобы добавить
Проверка хэша требует времени (и это хорошо). Когда пользователь вводит неправильное имя пользователя, не требуется времени, чтобы проверить, что имя пользователя неверно. Когда имя пользователя верно, мы начинаем проверку пароля - это относительно долгий процесс.
Для хакера было бы очень легко понять, существует пользователь или нет.
Не возвращайте немедленный ответ, если имя пользователя неверно.
Излишне говорить: никогда не отвечайте, что не так. Просто общее «Неправильные учетные данные».
источник
Ответы @ csharptest.net и Кристиана Голлхардта великолепны, большое вам спасибо. Но после запуска этого кода в производственной среде с миллионами записей я обнаружил утечку памяти. Классы RNGCryptoServiceProvider и Rfc2898DeriveBytes являются производными от IDisposable, но мы не избавляемся от них. В ответ напишу свое решение, если кому-то понадобится утилизированная версия.
Использование:
источник