using System; using System.Security.Cryptography; using Microsoft.AspNetCore.Cryptography.KeyDerivation; namespace AS400API.Auth; public static class PasswordHasher { private const int SaltSize = 16; private const int KeySize = 32; private const int Iterations = 100_000; public static (string Hash, string Salt) HashPassword(string password) { var salt = RandomNumberGenerator.GetBytes(SaltSize); var hashBytes = KeyDerivation.Pbkdf2(password, salt, KeyDerivationPrf.HMACSHA256, Iterations, KeySize); return (Convert.ToBase64String(hashBytes), Convert.ToBase64String(salt)); } public static bool Verify(string password, string storedHash, string storedSalt) { var saltBytes = Convert.FromBase64String(storedSalt); var computedBytes = KeyDerivation.Pbkdf2(password, saltBytes, KeyDerivationPrf.HMACSHA256, Iterations, KeySize); var storedBytes = Convert.FromBase64String(storedHash); return CryptographicOperations.FixedTimeEquals(storedBytes, computedBytes); } }