2022-02-03 15:26:44 +00:00
|
|
|
namespace ASC.Security.Cryptography;
|
|
|
|
|
|
|
|
[Singletone]
|
|
|
|
public class PasswordHasher
|
2020-09-15 13:11:05 +00:00
|
|
|
{
|
2022-02-03 15:26:44 +00:00
|
|
|
public int Size { get; private set; }
|
|
|
|
public int Iterations { get; private set; }
|
|
|
|
public string Salt { get; private set; }
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public PasswordHasher(IConfiguration configuration, MachinePseudoKeys machinePseudoKeys)
|
|
|
|
{
|
2022-02-08 11:07:28 +00:00
|
|
|
if (!int.TryParse(configuration["core:password:size"], out var size))
|
|
|
|
{
|
|
|
|
size = 256;
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
Size = size;
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-08 11:07:28 +00:00
|
|
|
if (!int.TryParse(configuration["core.password.iterations"], out var iterations))
|
|
|
|
{
|
|
|
|
iterations = 100000;
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
Iterations = iterations;
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
Salt = (configuration["core:password:salt"] ?? "").Trim();
|
|
|
|
if (string.IsNullOrEmpty(Salt))
|
|
|
|
{
|
|
|
|
var salt = Hasher.Hash("{9450BEF7-7D9F-4E4F-A18A-971D8681722D}", HashAlg.SHA256);
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
var PasswordHashSaltBytes = KeyDerivation.Pbkdf2(
|
|
|
|
Encoding.UTF8.GetString(machinePseudoKeys.GetMachineConstant()),
|
|
|
|
salt,
|
|
|
|
KeyDerivationPrf.HMACSHA256,
|
|
|
|
Iterations,
|
|
|
|
Size / 8);
|
|
|
|
Salt = BitConverter.ToString(PasswordHashSaltBytes).Replace("-", string.Empty).ToLower();
|
2020-09-15 13:11:05 +00:00
|
|
|
}
|
2022-02-03 15:26:44 +00:00
|
|
|
}
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public string GetClientPassword(string password)
|
|
|
|
{
|
2022-02-08 11:07:28 +00:00
|
|
|
if (string.IsNullOrWhiteSpace(password))
|
|
|
|
{
|
|
|
|
password = Guid.NewGuid().ToString();
|
|
|
|
}
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
var salt = new UTF8Encoding(false).GetBytes(Salt);
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
var hashBytes = KeyDerivation.Pbkdf2(
|
|
|
|
password,
|
|
|
|
salt,
|
|
|
|
KeyDerivationPrf.HMACSHA256,
|
|
|
|
Iterations,
|
|
|
|
Size / 8);
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
var hash = BitConverter.ToString(hashBytes).Replace("-", string.Empty).ToLower();
|
2020-09-15 13:11:05 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
return hash;
|
2020-09-15 13:11:05 +00:00
|
|
|
}
|
2022-02-08 11:07:28 +00:00
|
|
|
}
|