/
ilyakos
/
ChatWithAI
Обзор
Документация
Войти
/
ilyakos
/
ChatWithAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ChatWithAI_Server/Services/PasswordHasher.cs
66 строк
3 KB
Косоуров Илья Николаевич
заготовка сделана, есть авторизация и БД для работы с пользователями
15 май 2026, 23:16
15 май 2026, 23:16
d14fac3
Код
Авторство
О чём код?
using System.Security.Cryptography; namespace ChatWithAI_Server.Services; /// <summary> /// Утилита хеширования паролей на основе PBKDF2-SHA512. /// Использует только стандартную библиотеку .NET — без сторонних зависимостей. /// </summary> internal static class PasswordHasher { /// <summary>Длина соли в байтах.</summary> private const int SaltSize = 16; /// <summary>Длина хеша в байтах.</summary> private const int HashSize = 32; /// <summary>Число итераций PBKDF2.</summary> private const int Iterations = 200_000; /// <summary> /// Хеширует пароль и возвращает строку для хранения в базе данных. /// Формат: <c>{итерации}.{соль_base64}.{хеш_base64}</c>. /// </summary> /// <param name="password">Открытый пароль пользователя.</param> /// <returns>Строка хеша для хранения.</returns> internal static string Hash(string password) { var salt = RandomNumberGenerator.GetBytes(SaltSize); var hash = Rfc2898DeriveBytes.Pbkdf2( password, salt, Iterations, HashAlgorithmName.SHA512, HashSize); return $"{Iterations}.{Convert.ToBase64String(salt)}.{Convert.ToBase64String(hash)}"; } /// <summary> /// Проверяет, соответствует ли открытый пароль сохранённому хешу. /// </summary> /// <param name="password">Открытый пароль для проверки.</param> /// <param name="storedHash">Хеш из базы данных.</param> /// <returns><c>true</c>, если пароль верный; иначе <c>false</c>.</returns> /// <exception cref="FormatException">Если формат хеша повреждён.</exception> internal static bool Verify(string password, string storedHash) { var parts = storedHash.Split('.'); if (parts.Length != 3) throw new FormatException("Недопустимый формат хеша пароля."); var iterations = int.Parse(parts[0]); var salt = Convert.FromBase64String(parts[1]); var expectedHash = Convert.FromBase64String(parts[2]); var actualHash = Rfc2898DeriveBytes.Pbkdf2( password, salt, iterations, HashAlgorithmName.SHA512, expectedHash.Length); return CryptographicOperations.FixedTimeEquals(actualHash, expectedHash); } }