38 lines
1.1 KiB
C#
38 lines
1.1 KiB
C#
using System.Text;
|
|
using System.Security.Cryptography;
|
|
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
|
|
|
|
namespace CryptoProvider {
|
|
|
|
public static class HashService {
|
|
private static string CreateSalt() {
|
|
byte[] randomBytes = new byte[128 / 8];
|
|
using (var generator = RandomNumberGenerator.Create()) {
|
|
generator.GetBytes(randomBytes);
|
|
return Convert.ToBase64String(randomBytes);
|
|
}
|
|
}
|
|
|
|
private static string CreateHash(string value, string salt) {
|
|
var valueBytes = KeyDerivation.Pbkdf2(
|
|
password: value,
|
|
salt: Encoding.UTF8.GetBytes(salt),
|
|
prf: KeyDerivationPrf.HMACSHA512,
|
|
iterationCount: 10000,
|
|
numBytesRequested: 256 / 8);
|
|
|
|
return Convert.ToBase64String(valueBytes);
|
|
}
|
|
|
|
public static (string, string) CreateSaltedHash(string value) {
|
|
var salt = CreateSalt();
|
|
var hash = CreateHash(value, salt);
|
|
|
|
return (salt, hash);
|
|
}
|
|
|
|
public static bool ValidateHash(string value, string salt, string hash) =>
|
|
CreateHash(value, salt) == hash;
|
|
}
|
|
}
|