gpt4 book ai didi

c# - 将 Simplemembership 创建的散列密码与 WPF 输入的密码匹配

转载 作者:行者123 更新时间:2023-12-03 10:59:34 28 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

8年前关闭。




Improve this question




我有一个 WPF 应用程序和一个基于 MVC 的网站。我希望 WPF 应用程序读取 MVC 网站为密码信息创建的数据库,以指定哈希密码。如何散列输入的 WPF 密码以匹配 MVC 创建的数据库中的散列密码?

我已经拥有的:

  • 是一个使用 EF 创建的基于 MVC 的网站
    多个数据库。
  • 其中一个数据库包含所有密码信息,例如
    哈希密码和盐。
  • 我在 MVC 项目中使用 Simplemembership。

  • 编辑:最初,我不知道我需要手动散列密码。感谢下面的解决方案,现在我知道了。我还没有测试它,因为我仍在为它创建逻辑。
        [Table("webpages_Membership")]
    public class Membership
    {
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    public DateTime? CreateDate { get; set; }
    public string ConfirmationToken { get; set; }
    public bool IsConfirmed { get; set; }
    public DateTime? LastPasswordFailureDate { get; set; }
    public int PasswordFailuresSinceLastSuccess { get; set; }
    public string Password { get; set; }
    public DateTime? PasswordChangedDate { get; set; }

    [Required(AllowEmptyStrings = true), MaxLength(128)]
    public string PasswordSalt { get; set; }

    [MaxLength(128)]
    public string PasswordVerificationToken { get; set; }

    public DateTime? PasswordVerificationTokenExpirationDate { get; set; }
    }

    编辑:
    我得出的结论是,我需要在网站本身上验证密码,并将 bool 响应发送回验证凭据的 wpf 应用程序。我正在进一步研究这个问题,以确定我是否需要 wcf 或 Web 服务来做到这一点。

    最佳答案

    我假设您使用的是 SimpleMembershipProvider .默认情况下,密码是散列的,这意味着加密只能“一种方式”完成,一旦一个字节数组被散列,你就不能将它转换回纯文本格式。

    所以基本上,您需要做的是从数据库中检索散列密码和密码盐。然后散列您的WPF 提供的密码。应用程序用户(目前使用您刚刚从数据库中检索到的密码盐以纯文本形式显示。这是一个示例......

        public string HashPassword(string password, string passwordSalt)
    {
    int saltSize = 128 / 8;//128 bits = 16 bytes
    int PBKDF2SubkeyLength = 256 / 8; //256 bits = 32 bytes
    byte[] salt;
    byte[] subkey;
    using (var deriveBytes = new Rfc2898DeriveBytes(password, saltSize, 1000))
    {
    salt = deriveBytes.Salt;
    subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
    }

    byte[] outputBytes = new byte[1 + saltSize + PBKDF2SubkeyLength];
    Buffer.BlockCopy(salt, 0, outputBytes, 1, saltSize);
    Buffer.BlockCopy(subkey, 0, outputBytes, 1 + saltSize, PBKDF2SubkeyLength);
    return Convert.ToBase64String(outputBytes);
    }

    此方法将返回您用于验证和比较用户提供的密码与存储在数据库中的密码哈希的密码哈希...
    public bool Login(string username, string password)
    {
    var user = GetUser(username); //get the user from the database including the password hash and salt

    //hash the password provided in the login screen
    string pwdHash = HashPassword(password, user.PasswordSalt);

    return pwdHash.equals(user.PasswordHash);
    }

    根据更多信息进行编辑

    好吧,你这里有一个大问题。从您提供的屏幕截图中,我可以看到所有用户的密码盐都是空的,这可能是您所有问题的主要来源,因为密码是散列的。我认为导致您发送空白密码盐的原因是您的 EF 实体中的映射,更具体地说是这一行代码......
    [Required(AllowEmptyStrings = true), MaxLength(128)]
    public string PasswordSalt { get; set; }

    这是指示 EF 忽略空白密码盐。您需要将其更改为...
    [Required, MaxLength(128)]
    public string PasswordSalt { get; set; }

    但从本质上讲,您确实需要阅读有关 SimpleMembershipProvider 的教程。在 MVC4所以你知道如何处理可能出现的其他问题。这是 Jon Galloway 的一个好消息,请阅读

    如果您遇到任何问题,请告诉我

    关于c# - 将 Simplemembership 创建的散列密码与 WPF 输入的密码匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985375/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com