我在哪里哈希密码?

时间:2013-01-18 03:49:36

标签: php password-encryption

我正在使用MVC,我想知道在哪一点上散列用户密码:

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

    中使用"set password = sha256(:password)"

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

4 个答案:

答案 0 :(得分:3)

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

  • 在数据库中:太低了。数据库永远不应该看到明文密码;在某些情况下,执行此操作最终会通过网络发送明文密码,将其显示在错误消息中,或将其写入数据库日志。此外,数据库支持的大多数哈希函数都太快而无法保密以进行密码存储。

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

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

    请注意,这些方法都没有公开密码或它的存储方式 - 这都是对象的实现细节。

答案 1 :(得分:1)

尽快将其哈希在服务器上。即。一旦收到客户的请求。你真的没有使用原始密码的业务。存储哈希,忘掉它。

根据经验,您应该将密码或密码的密码视为热土豆:您希望尽快停止处理它们。

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

答案 2 :(得分:1)

代表逻辑使用User实体的domain object。这是在模型层内。

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

答案 3 :(得分:-1)

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

(我不是专家......乐于分享我的信息.. :)