我在哪里散列密码?

ran*_*alt 4 php password-encryption

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

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

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

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

小智 5

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

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

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

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

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