Any pointers on the level of security this hashing function perform at? I have never had to really write my own modules for security before.
public static class Hashing
{
public static int SaltSize = 32;
public static string HashPassword(string passwordToHash, byte[] salt, int numberOfRounds)
{
var hashedPassword = HashPassword(Encoding.UTF8.GetBytes(passwordToHash), salt, numberOfRounds);
return Convert.ToBase64String(salt.Concat(hashedPassword).ToArray());
}
public static string HashPassword(string passwordToHash, int numberOfRounds)
{
var salt = GenerateSalt();
var hash = HashPassword(passwordToHash, salt, numberOfRounds);
return hash;
}
public static byte[] GenerateSalt()
{
using (var randomNumberGenerator = new RNGCryptoServiceProvider())
{
var randomNumber = new byte[SaltSize];
randomNumberGenerator.GetBytes(randomNumber);
return randomNumber;
}
}
public static byte[] HashPassword(byte[] toBeHashed, byte[] salt, int numberOfRounds)
{
using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(toBeHashed, salt, numberOfRounds))
{
return rfc2898DeriveBytes.GetBytes(SaltSize);
}
}
}
public abstract class HashVerification
{
public abstract string GetDatabaseHash(string username);
public bool HashMatch(string username, string password)
{
var combinedHash = GetDatabaseHash(username);
var salt = Convert.FromBase64String(combinedHash).Take(Hashing.SaltSize).ToArray();
var serverHash = Hashing.HashPassword(password, salt, username.Length * 100);
return combinedHash.Equals(serverHash);
}
}