servicestack,password-hash,C#,Authentication,Passwords,servicestack,Password Hash" /> servicestack,password-hash,C#,Authentication,Passwords,servicestack,Password Hash" />

C# 使用ServiceStack存储和比较多个密码

C# 使用ServiceStack存储和比较多个密码,c#,authentication,passwords,servicestack,password-hash,C#,Authentication,Passwords,servicestack,Password Hash,我正在尝试在应用程序中创建密码过期函数。已设置密码以及身份验证和更改密码。现在我想提示用户在x时间后更改密码 当用户更改密码时,我的Angular frontend发出该请求,我希望我的C#Service Stack API将给定的新密码与当前密码以及之前的密码进行比较,以检查是否存在重复 我不担心细微的变化。如果用户提交相同的密码,但有一个额外的字符,例如,这是罚款。我想成为一个尽可能简单的开始 密码存储在MS SQL Server中,分为两列Salt varchar(8000)和Passwo

我正在尝试在应用程序中创建密码过期函数。已设置密码以及身份验证和更改密码。现在我想提示用户在x时间后更改密码

当用户更改密码时,我的Angular frontend发出该请求,我希望我的C#Service Stack API将给定的新密码与当前密码以及之前的密码进行比较,以检查是否存在重复

我不担心细微的变化。如果用户提交相同的密码,但有一个额外的字符,例如,这是罚款。我想成为一个尽可能简单的开始


密码存储在MS SQL Server中,分为两列
Salt varchar(8000)
PasswordHash varchar(8000)
。我已经准备好了所有的东西,我只是对如何将散列密码与用户提供的字符串进行比较感到非常困惑。然后将旧密码保存在新的哈希列中。我已经在网上和软件上搜索了三天了,但什么也没找到。非常感谢您的指导。

在@Fildor评论之后,您需要创建一个包含现有密码哈希的密码更改审核历史记录。从ServiceStack切换到使用ASP.NET Identity v3使用的相同PBKDF2密码哈希算法,该算法将密码哈希+salt+迭代+算法版本存储在
UserAuth
表上的单个密码哈希字段中,因此,密码审核历史记录表只需要一列来存储现有密码哈希

密码散列算法可从依赖项获得,您可以在服务实现中使用该算法,如:

public IPasswordHasher PasswordHasher { get; set; }

public object Any(AllowPassword request)
{
    var passwordHashes = MyRepo.GetExistingUserPasswords(GetSession().UserAuthId);
    foreach (var passwordHash in passwordHashes)
    {
        if (PasswordHasher.VerifyPassword(passwordHash, request.Password, out var neeedsRehash)
            throw new ArgumentException("Can't use existing password", nameof(request.Password));
    }

    return new AllowPasswordResponse();
}

使用新行,而不是新列。比较它们就像验证它们一样:根据算法对用户条目进行散列,然后比较散列。如果他们不一样,密码也不一样。好吧,太棒了。在您回答之前,我试图使用
SaltedHash.GetHashAndSaltString()
。但是你的解决方案看起来干净多了。@marcusshep
IHashProvider.GetHashAndSaltString()
是旧的哈希算法,它将passwordHash和salt存储在两个字段中。v5之后的所有密码都使用较新的
IPasswordHasher
算法进行散列。不幸的是,我们使用的是ServiceStack v4。正如我在问题中提到的,salt和hash存储在两个单独的字段中。所以,我的密码历史记录表必须有UserId、Hash和Salt@迈兹