using System.Collections.Generic;
using System.Security.Cryptography;
public static void Main()
string testPassword = "YyH+p5dZws(sgfu$";
var creds = EncryptionHelper.CreateHash(testPassword);
Console.WriteLine($"Registered Password: {testPassword}\tSalt: {creds.salt}\tHash: {creds.hash}");
var loginHash = EncryptionHelper.GetHash(creds.salt, testPassword);
Console.WriteLine($"Original Hash: {creds.hash}");
Console.WriteLine($" New Hash: {loginHash}");
Console.WriteLine($"Result: {loginHash == creds.hash}");
public class EncryptionHelper
public const int SALT_SIZE = 128;
public const int HASH_SIZE = 128;
public const int ITERATIONS = 100000;
public static (string salt, string hash) CreateHash(string input)
var provider = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_SIZE];
var pbkdf2 = new Rfc2898DeriveBytes(input, salt, ITERATIONS);
var hash = pbkdf2.GetBytes(HASH_SIZE);
var saltString = Convert.ToBase64String(salt);
var hashString = Convert.ToBase64String(hash);
return (saltString, hashString);
public static string GetHash(string saltString, string passwordString)
byte[] salt = Convert.FromBase64String(saltString);
var pbkdf2 = new Rfc2898DeriveBytes(passwordString, salt, ITERATIONS);
return Convert.ToBase64String(pbkdf2.GetBytes(HASH_SIZE));