我的访问令牌策略是一种好的做法还是易受攻击的?

时间:2015-12-03 09:37:39

标签: php mysql api encryption api-design

  • 我正在为 实时网络应用 开发 API ,以使其与移动应用配合使用。
  • 我希望通过移动应用程序访问/修改我的用户数据。
  • 为避免每次访问用户数据时都将用户凭据发送到服务器,我将实现Access令牌。

那是什么?.. 我将把它们存储在访问令牌中,而不是存储生成的访问令牌详细信息,如 user_id,expiry_time,user_ip等,在数据库中。本身即可。因此,每次用户请求更新时,我都可以避免数据库查询。

我正在考虑遵循API策略:

  • 最初,移动应用向用户询问用户 电子邮件 密码 ,并向API服务器发送请求以获取访问权限令牌。
  • API服务器根据数据库表检查用户凭据。
  • 如果用户存在,
    • 收集 user_id,timestamp,user_ip等,
    • 使用以上数据格式化 逗号分隔的字符串 。(或url_encode?)
    • 使用 <
    • 加密 使用 加密密钥(我保持安全) 的逗号分隔字符串em> Mcrypt Library
    • base64_encode 加密数据, 将其作为访问令牌 返回。
  • 移动应用程序将此返回的令牌存储起来供以后使用。
  • 应用程序的其他请求随令牌一起发送。
  • 当API服务器收到带令牌的访问请求时,
    • 使用相同的加密密钥解密令牌 。 (所以,我们将得到相同的逗号分隔字符串)
    • 解析解密的分隔字符串 。我们 获取user_id,timestamp,user_ip
    • 直接使用,
      1. user_id 以获取相应的用户数据。
      2. 时间戳 ,以检查令牌是否已过期。
      3. user_ip 以决定是否允许/拒绝用户IP地址更改。

如果加密失败,我们可以将其视为无效的访问令牌。

优点: 每次用户请求新数据时都不需要进行数据库查询。所以,节省了时间和资源。

我没有发现这种方法有任何漏洞/问题。那是我在这里!请提供宝贵的反馈意见!

注意: 我不知道这是否是访问令牌的常用方式。对不起,如果是。

1 个答案:

答案 0 :(得分:1)

请勿将 可逆加密 交给用户。您将需要为所有用户使用相同的加密密钥,这意味着您有一个非常非常秘密的密钥,您必须确保保密。如果此密钥泄漏,任何用户都可以通过重新创建令牌方案并选择任意用户ID来体现任何其他用户。由于您将密码数据传递给用户,因此他们可以轻松地对其进行离线攻击(例如,只需尝试数据上的任何和所有密钥组合,直到成功解密)。一旦通过这种方式发现密钥,除了更改密钥之外,您无需追索。

相反,使用哈希,它专门用于减缓这种暴力攻击,使其在实践中变得不可能。使用 签名的令牌 实现此目的。这意味着,您使用相同的信息(用户ID,IP,时间戳),您添加随机生成的值,您使用您的密钥对所有这些进行哈希,并发送除密钥之外的所有这些部分给用户。

// user_id,ip,timestamp,random_token,hash
42,127.0.0.1,12345678,oiawd8juht4mp9384,q209c8yqc23n09rhcq823n9t87q432hnq9493q784gth

信息都可以是明文的,因为它本身没有意义,并且它被哈希验证,如果没有密钥则不能伪造。为此目的使用昂贵的HMAC hash