public async Task <byte[]> DeriveHashAsync(byte[] value, byte[] salt, int byteCount) { // just to be safe var k = new byte[value.Length]; value.AsSpan().CopyTo(k); var s = salt != null ? new byte[salt.Length] : null; if (s != null) { salt.AsSpan().CopyTo(s); } var argon2 = new Argon2id(k) { DegreeOfParallelism = this.Parallelism ?? (Environment.ProcessorCount * 2), MemorySize = this.MemorySize ?? 131072, /* 128 MiB */ Iterations = this.Iterations ?? ComputeIterations(Environment.ProcessorCount), Salt = s }; return(await argon2.GetBytesAsync(byteCount)); }
public Task <byte[]> HashPassword(string password, byte[] salt) { var argon2 = new Argon2id(Encoding.UTF8.GetBytes(password)) { Salt = salt, DegreeOfParallelism = 2, Iterations = 2, MemorySize = 1024 }; return(argon2.GetBytesAsync(16)); }
/// <summary> /// Create a Hash byte array using Argon2id. /// </summary> /// <param name="passphrase"></param> /// <param name="salt"></param> /// <param name="size"></param> public static async Task <byte[]> GetHashKeyAsync(byte[] passphrase, byte[] salt, int size) { using var argon2 = new Argon2id(passphrase) { DegreeOfParallelism = 4, MemorySize = 2048, Salt = salt, Iterations = 12 }; return(await argon2.GetBytesAsync(size).ConfigureAwait(false)); }
private static async Task <string> GetArgon2Hash(string clearText, byte[] salt, int degreesOfParallelism, int iterations, int memorySize, int hashLength) { var argon2 = new Argon2id(Encoding.UTF8.GetBytes(clearText)) { Salt = salt, DegreeOfParallelism = degreesOfParallelism, Iterations = iterations, MemorySize = memorySize }; string saltString = Convert.ToBase64String(argon2.Salt); byte[] hash = await argon2.GetBytesAsync(hashLength); string hashString = Convert.ToBase64String(hash); return($"$a2${degreesOfParallelism}${iterations}${memorySize}${salt.Length}${hashLength}${saltString}${hashString}"); }
public static async Task <Argon2Key> Calculate(SecureString password) { var buffer = new byte[password.Length]; var ptr = Marshal.SecureStringToGlobalAllocAnsi(password); try { Marshal.Copy(ptr, buffer, 0, buffer.Length); using (var argon2 = new Argon2id(buffer) { Iterations = 10, DegreeOfParallelism = 16, MemorySize = 256 }) { return(new Argon2Key(await argon2.GetBytesAsync(32))); } } finally { Helpers.ClearData(buffer); Marshal.ZeroFreeGlobalAllocAnsi(ptr); } }
public async Task <byte[]> GetHashAsync() { return(await _argon.GetBytesAsync(128)); }