【问题标题】:PHP: Efficient use of password_hashPHP:有效使用password_hash
【发布时间】:2019-06-09 09:46:10
【问题描述】:

对于(几乎)每个操作,某些 Android APP 都会对位于服务器上的 php 脚本执行查询,以发送/接收数据。对于每个此类查询,APP 用户的用户名/密码都会传输到脚本以进行授权。

但是,该脚本使用 php 的 password_hash() 函数在每次访问期间验证用户凭据。由于password_hash()很慢,这会导致糟糕的用户体验,因为APP需要很长时间才能将请求的数据通过脚本处理/返回给APP。

我想知道如何处理这个问题。

我打算使用的一种方法是脚本除了发送用户名/密码之外还发送一个 sessionID。该脚本反过来仅每 X 分钟和/或每 Y 个请求运行一次 password_hash() 函数,同时更新 sessionID(如果用户凭据有效)。在其他访问期间,仅检查 sessionID 是否有效。 sessionID 以纯文本形式保存在服务器上,因此检查速度很快。

由于用户凭据和 sessionID 都可能被第三方猜测,因此在避免不允许的访问方面似乎没有太大区别。

我看到的建议方法的唯一缺点可能是 sessionID 以纯文本形式存储,以便第三方可以读取它(它以某种方式获得了对数据库的访问权限)。但是,可以通过适当调整 X 和 Y 的值来降低这种风险,从而调整 sessionID 的有效时间段。

这种方法有什么替代方案或缺点吗?

【问题讨论】:

标签: php authorization password-hash


【解决方案1】:

用访问令牌替换用户名/密码是一种非常常见的方法,可以提高安全性,因为

  1. 无需为每个请求发送密码,并且
  2. 因为令牌通常比用户密码强得多。

这毕竟是像OAuth2 这样的身份验证服务所做的。

会话 id 类似于访问令牌,因为这里也不会为每个请求发送密码。会话 id 应该足够强(例如,至少 20 个字符的随机序列 0..9,1..z,A..Z),然后它就无法被猜到,也不需要慢速密码哈希函数存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多