reactredux/webapi/CryptoProvider/HashService.cs

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