CSharp · Console
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
public class Program
{
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;
// On declaring a new password for example
public static (string salt, string hash) CreateHash(string input)
{
var provider = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_SIZE];
provider.GetBytes(salt);
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);
}
// To check if Users password input is correct for example
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));
}
}