using Microsoft.AspNetCore.Cryptography.KeyDerivation; using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; namespace ReallifeGamemode.Server.Common { public class PasswordHasher { public static byte[] GetNewSalt(int length = 256) { if ((length % 8) != 0) { throw new ArgumentException("Length mus be completely divisble through 8"); } var salt = new byte[length / 8]; using (var rng = RandomNumberGenerator.Create()) { rng.GetBytes(salt); } return salt; } public static string HashPassword(string password, byte[] salt, int length = 512) { if ((length % 8) != 0) { throw new ArgumentException("Length mus be completely divisble through 8"); } var hashedPassword = KeyDerivation.Pbkdf2(password, salt, KeyDerivationPrf.HMACSHA512, 50000, length / 8); return Convert.ToBase64String(hashedPassword); } } }