Q74058242

CSharp · Console

/Program.cs

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));
	}
}
;