【发布时间】:2020-08-17 17:09:48
【问题描述】:
我正在尝试使用libsodium 实现安全密码存储,但docsTestWorks、hashesDontMatch 和wrongPassword 似乎总是正确。我不认为他们应该是。我做错了什么(或很多事)吗?
public async Task<IUser> Authenticate(ICredentials credentials)
{
using var connection = _databaseGateway.Connection;
connection.Open();
const string PASSWORD = "Correct Horse Battery Staple";
var hash = PasswordHash
.ScryptHashString(PASSWORD);
var docsTestWorks = PasswordHash.ScryptHashStringVerify(hash, PASSWORD);
var incomingHash = PasswordHash
.ScryptHashString(credentials.Password);
var test1 = PasswordHash
.ScryptHashString("myPassword");
var test2 = PasswordHash
.ScryptHashString("myPassword");
var hashesDontMatch = test1 != test2;
var users = await connection.GetAllAsync<User>();
var existingUser = users
.Single(u => u.Username == credentials.Username);
var wrongPassword = !PasswordHash
.ScryptHashStringVerify(existingUser.PasswordHash, credentials.Password);
if (wrongPassword)
throw new AuthenticationException(Error.WrongPassword,
"Error: Incorrect Password.");
return AddToken(existingUser);
}
我觉得这太简单了,我可能遗漏了很多东西......
我正在使用的包:
dotnet add package Sodium.Core
【问题讨论】:
-
libsodium是否在散列密码中添加了盐?如果是这样,它们实际上将永远不会相同。 -
@TonyTroeff 是的。我认为确实如此。但是我看不到如何从外部传递它进行比较。
标签: libsodium c# asp.net-core passwords password-hash libsodium