5

我正在使用 MVC,我想知道在什么时候对用户密码进行哈希处理:

  1. 在发送到服务器之前(查看)
  2. 在服务器中,当我设置对象字段(模型)
  3. 在服务器中,当我将对象发送到控制器(控制器)
  4. 在服务器中,当我准备语句时(控制器)
  5. 在数据库中,

例如"set password = sha256(:password)"在语句中使用

我有点困惑,当我创建对象并设置字段“密码”时,我一直在对密码进行哈希处理,但我在某处读到它不够安全。我不知道。

4

4 回答 4

5
  • 在视图中:这太高了。几乎可以肯定,您的应用程序中会有多个视图使用密码(两个简单的视图:登录表单和密码更改表单),并且在视图中使用密码散列会导致重复。

  • 在数据库中:太低了。数据库不应该看到明文密码;在某些情况下,这样做可能会最终通过网络发送明文密码,在错误消息中显示它们,或者将它们写入数据库日志。此外,数据库支持的大多数散列函数太快,无法安全地存储密码。

  • 在模型中:恰到好处。我建议在用户对象上实现类似的方法:

    $user->setPassword($password)    # sets password to specified value
    $user->passwordEquals($password) # returns true if value passed in matches the password
    

    请注意,这些方法都不会公开密码或密码的存储方式——这都是对象的实现细节。

于 2013-01-18T04:01:12.897 回答
1

尽快在服务器上散列它。IE。一旦您收到客户的请求。真的,您与原始密码无关。存储哈希,然后忘记它。

根据经验,您应该将密码或密码哈希视为烫手山芋:您希望尽快停止处理它们。

此外,如果服务器进程受到威胁,您不希望敏感信息潜伏在服务器内存中。这就是为什么您应该避免让原始密码在内存中停留太久的原因。

于 2013-01-18T04:03:16.167 回答
1

在表示逻辑使用实体的领域对象中。User那是在模型层内。

此外,不应认为 SHA256 足够好。应该使用bcrypt。最好有crypt()功能。

于 2013-01-18T12:29:09.057 回答
0

首先获取该字段中的值。然后应用该hash功能。在你的控制器中进行上述操作,然后调用模型存储到数据库中。它会让你有更好的理解。

(我不是专家......很高兴分享我的信息...... :)

于 2013-01-18T03:59:21.130 回答