【问题标题】:Check if entered password is hashed检查输入的密码是否经过哈希处理
【发布时间】:2015-12-02 08:27:46
【问题描述】:

场景是这样的:
密码作为散列密码返回输入字段,
1 - 第一个用户不更新密码;在这种情况下,只需返回当前的哈希密码,
2 - 否则用户更新他/她的密码,然后对新密码进行哈希处理,然后将其保存在数据库中。
那么如何检查返回的密码是否经过哈希处理?

代码:

public int UpdatePrivilege(User user, int changerId, string pwd)
{
    if (user.pwd == pwd) //how to check if hashed or not.
    {
        user.pwd = _Md5Hash(user.pwd);
    }
    return dalc.Update(user, changerId);
}

其次,假设用户没有更新密码;保存过程后旧密码会保持原样吗?

【问题讨论】:

  • 但我看不到链接的答案如何解决 OP 的问题。如果用户输入像7A34FE 这样的新密码,其他答案的正则表达式会告诉他它已经被散列了。您必须跟踪用户是否通过输入字段的TextChanged 事件或输入字段中的最终文本与您之前输入的哈希值的比较来更改密码。

标签: c# hash


【解决方案1】:

你走错方向了。考虑以下情况:

  1. 我的密码是abc,它将被散列(比如MD5)并存储在数据库中,如75d22b7a1b5be026653445831b9f0c61

  2. 当我打开页面时,将使用哈希字符串(可能在 UI 代码中)。

  3. 我将密码从 abc 更改为 75d22b7a1b5be026653445831b9f0c61

  4. 您的代码获取了我的新密码并判断它没有更改。错了。

您永远无法从密码文本中判断用户是否更改了密码,只有 UI 代码(比如网络应用程序中的 javascript)知道这一点。如果发生更改,您应该让 UI 代码告诉后端。

【讨论】:

  • 如果您输入了相同的密码,它会更改,但它的值将保持为旧密码,因为您输入了相同的字符。因此更改日期可以表明密码已更改。我说的对吗?
  • @Smart 如果我将密码更改为75d2...,在数据库中它应该是c6b24c3e4e98ae50cc5a5f1fd7eed790,我的新密码的md5哈希。
【解决方案2】:

我认为这是一个单一的责任问题。 你的方法应该只做一件事。请检查密码是否正确,如果需要更改密码或检查是否更改。

仅仅通过接收一个字符串是不可能决定它是否被散列的。 您可以对密码本身做一些限制,比如说不超过 30 个字符,然后确保哈希值总是超过 30 个(或者密码必须包含哈希值不能包含的特殊字符),但这并不总是有效并且不会也是个好主意。

我建议为每个功能创建单独的方法。 IE:哈希密码、修改密码、检查密码。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 2021-01-25
    • 1970-01-01
    • 2013-10-24
    • 2022-08-17
    • 1970-01-01
    • 2019-04-07
    • 2021-07-13
    相关资源
    最近更新 更多