【问题标题】:Auth token encryption - suggestions身份验证令牌加密 - 建议
【发布时间】:2014-07-01 07:17:36
【问题描述】:

我正在开发一个 RESTful API,并考虑使用 OAuth 进行类似密码流的身份验证。但是,我决定实现自己的身份验证机制,因为我不想在我的项目中使用 OAuth 的开销。

一切运行良好,但目前我没有使用任何形式的身份验证令牌加密。我应该使用什么?您能否提供一些可以为我指明正确方向的文章? API 将通过 HTTPS 使用。

编辑:

我正在使用以下函数来生成访问令牌:

public function generateToken($user)
{
    return hash_hmac('sha256', Str::random(10), $user->id.time().uniqid(), false); 
}

这足够安全吗?

【问题讨论】:

  • 我想您的身份验证令牌是随机会话 ID?如果我对您的系统的假设是正确的,那么您根本不需要对其进行加密(假设它始终通过 HTTPS 传输,正如您所说并且您应该这样做)。为什么要加密?
  • 我正在使用str_random(40) 手动生成访问令牌。据我所知,这还不够安全。
  • 在 PHP 中你可以获得更好的随机数据:stackoverflow.com/a/1551064/371137。与大多数其他语言/框架一样,还有一个内置的会话管理系统。
  • 我已经编辑了我的问题。
  • 我可能仍然更喜欢直接使用加密安全的随机数生成器,而不是自己构建一个伪 RNG,但只要 Str::random(10) 不太可能重复自己,这应该是好的。顺便提一句。我不确定 random 的第一个参数是否应该是一个数字:fuelphp.com/docs/classes/str.html - 这可能是个问题。

标签: rest authentication encryption oauth


【解决方案1】:

BCrypt-ruby 解释了为什么使用 BCrypt 来保存安全密码,并提供了一些在授权场景中使用 BCrypt 的简单示例。

BCrypt 支持多种不同的语言,因此可能会有所帮助。如果您正在使用自己的身份验证系统,这是一种简单的方法。

【讨论】:

  • 据我所知,doitmyway 不是在问如何保存密码,而是在他/她知道用户是谁之后该怎么做。
  • 在这种情况下,令牌实际上只是表示此会话安全的标志。如果 doitmyway 使用的是 HTTPS,那么应该没问题。另一方面,如果登录是 https,然后其余的是纯 http,那么他可能希望一直切换到 https,以便令牌是安全的,如您在评论中所述。感谢您的澄清。
  • 所以你的意思是可以简单地使用str_random(40)生成一个随机字符串并将其作为用户的令牌存储在数据库中(然后在请求中使用它)?
  • 只要你使用 https,一切都应该被加密。因此,如果您已正确授权用户(他们已使用密码登录)并且您使用的令牌用于后续访问(登录后因此用户不必在页面刷新之间登录),那么令牌基本上是一个查找值以确保会话被授权。这就是我理解你正在尝试做的事情。将令牌存储在浏览器端,您应该使用安全 cookie:(blog.teamtreehouse.com/how-to-create-totally-secure-cookies)
  • "在这种情况下,令牌实际上只是表明此会话安全的标志。" …“那么令牌基本上是一个查找值,以确保会话被授权。” - 好吧,不,因为如果你能成功猜出令牌,那么攻击者可以在她的 https 请求中插入令牌,如果该用户的 id 在查找表中,则可以冒充任何用户(无需身份验证)。
猜你喜欢
  • 2011-10-03
  • 1970-01-01
  • 2010-10-24
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
相关资源
最近更新 更多