public static string Hash(string password, int iterations = 100000)
{
if (password == null) throw new ArgumentNullException("password");
byte[] salt;
byte[] bytes;
using (var algo = new Rfc2898DeriveBytes(password, SaltSize, iterations))
{
salt = algo.Salt;
bytes = algo.GetBytes(Pbkdf2SubkeyLength);
}
var iters = BitConverter.GetBytes(iterations);
if (!BitConverter.IsLittleEndian)
Array.Reverse(iters);
var parts = new byte[54];
Buffer.BlockCopy(salt, 0, parts, 1, SaltSize);
Buffer.BlockCopy(bytes, 0, parts, 17, Pbkdf2SubkeyLength);
Buffer.BlockCopy(iters, 0, parts, 50, sizeof(int));
return Convert.ToBase64String(parts);
}