/****************************************************************************/ /// <summary> /// Given an unhashed password and the owner (user) id returns a Password object /// </summary> /// <param name="password">The password typed in by the user</param> /// <param name="owner">An owner or user id. This could be a guid from a NoSql database or an identity column value (INT or BIGINT) from a SQL database</param> /// <returns>A Password object. Be sure to Dispose of this object as soon as not longer needed</returns> public Password FromOwner(string password, IPasswordOwner owner) { var unhashed = Encoding.UTF8.GetBytes(password); var salt = _passwordHasher.GenerateSalt(_saltLength); var hash = _passwordHasher.Hash(unhashed, salt, owner.ToArray); Array.Clear(unhashed, 0, unhashed.Length); return(new Password(hash, salt, owner)); }
/****************************************************************************/ /// <summary> /// Loads the hashed password associated with the owner/user /// </summary> /// <param name="owner">Owner or user of the password</param> /// <returns>A Password object containing the hashed password</returns> public async Task <Password> Load(IPasswordOwner owner) { var pwd = await _passwordStore.Get(owner, out byte[] salt); var unencryptedSalt = await _encryptor.Decrypt(salt); var password = new Password(pwd, unencryptedSalt, owner); Array.Clear(salt, 0, salt.Length); Array.Clear(unencryptedSalt, 0, unencryptedSalt.Length); return(password); }
public Task Add(byte[] password, byte[] salt, IPasswordOwner owner) { _passwords.Add(new Password(password, salt, owner)); return(Task.CompletedTask); }
public Task <byte[]> Get(IPasswordOwner owner, out byte[] salt) { salt = _passwords[0].Salt; return(Task.FromResult(_passwords[0].ToArray())); }
/****************************************************************************/ public Password(byte[] hash, byte[] salt, IPasswordOwner owner) { _hash = hash.DeepClone(); _salt = salt.DeepClone(); _owner = owner; }