50 lines
1.4 KiB
C#
50 lines
1.4 KiB
C#
using System;
|
|
using System.Security.Cryptography;
|
|
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
|
|
namespace GZTW.Pecklist.Util
|
|
{
|
|
//Authentication controller
|
|
public static class Hasher
|
|
{
|
|
|
|
public static string hash(string Salt, string Password)
|
|
{
|
|
|
|
//adapted from here:
|
|
//https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing
|
|
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
|
|
password: Password,
|
|
salt: Base64StringToByteArray(Salt),
|
|
prf: KeyDerivationPrf.HMACSHA512,
|
|
iterationCount: 10000,
|
|
numBytesRequested: 512 / 8));
|
|
return hashed;
|
|
}
|
|
|
|
|
|
///////////////////////////////////
|
|
// convert the salt to a byte array
|
|
public static byte[] Base64StringToByteArray(string b64)
|
|
{
|
|
return Convert.FromBase64String(b64);
|
|
}
|
|
|
|
|
|
///////////////////////////
|
|
// Generate a random salt
|
|
//
|
|
public static string GenerateSalt()
|
|
{
|
|
// generate a 128-bit salt using a secure PRNG
|
|
byte[] salt = new byte[128 / 8];
|
|
using (var rng = RandomNumberGenerator.Create())
|
|
{
|
|
rng.GetBytes(salt);
|
|
}
|
|
return Convert.ToBase64String(salt);
|
|
|
|
}
|
|
|
|
}//eoc
|
|
|
|
}//eons |