我的访问令牌策略是一种好的做法还是易受攻击?
Is my Access Token strategy a good practice or vulnerable?
- 我正在为我的实时 Web 应用程序开发API使其与移动应用程序一起使用。
- 我想让 access/modify 通过移动应用程序访问我的用户数据。
- 为了避免每次访问用户数据时都向服务器发送用户凭据,我将实施访问令牌。
那又怎样?.. 而不是存储生成的访问令牌详细信息,如 user_id、expiry_time、user_ip 等,在数据库,我将把它们存储在访问令牌本身中。因此,每次用户请求更新时我都可以避免数据库查询。
我正在考虑遵循 API 策略:
- 最初移动应用程序询问用户电子邮件和密码 来自用户并向 API 服务器发送请求以获取访问令牌。
- API 服务器根据数据库检查用户凭据 table。
- 如果用户存在,
- 收集user_id、时间戳、user_ip等,
- 用上述数据格式化逗号分隔的字符串。(或url_encode?)
- encrypt 逗号分隔的字符串 加密密钥(我保证安全) 使用 Mcrypt 库.
- base64_encode加密后的数据和return它作为访问令牌.
- 移动应用存储此 returned 令牌供以后使用。
- 应用程序的进一步请求与令牌一起发送。
- 当API服务器收到带有Token的访问请求时,
- 用相同的加密密钥解密令牌。 (所以,我们将得到相同的逗号分隔字符串)
- 解析解密的定界字符串。我们将得到user_id,时间戳,user_ip.
- 直接使用,
- user_id获取对应的用户数据。
- timestamp检查Token是否过期
- user_ip 决定 allow/deny 如果用户 IP 地址更改。
如果加密失败,我们可以断定它是无效的Access Token。
优点: 当用户请求新数据时,无需每次都查询数据库。因此,节省了时间和资源。
我没有发现这种方法有任何漏洞/问题。那就是我在这里!请提供您宝贵的意见!
注意: 我不知道这是否是访问令牌工作的常见方式。抱歉,如果是的话。
不要将可逆加密交给用户。您将需要为所有用户使用相同的加密密钥,这意味着您拥有一个非常非常机密的密钥,您必须确保它保密。如果此密钥泄露,任何用户都可以通过重新创建您的令牌方案并选择任意用户 ID 来体现任何其他用户。由于您将密码数据交给用户,他们可以轻松地对其发起离线攻击(例如,只需尝试对数据进行任何和所有密钥组合,直到成功解密)。以这种方式发现密钥后,除了更改密钥外别无他法。
相反,使用 hash 专门设计用于减慢这种暴力攻击的程度,以至于它们在实践中变得不可能。使用 签名令牌 实现此功能。这意味着,你使用相同的信息(用户 ID、IP、时间戳),你添加一个 随机生成的值 ,你用你的密钥散列所有这些,然后你发送所有这些部分,除了用户的密钥。
// user_id,ip,timestamp,random_token,hash
42,127.0.0.1,12345678,oiawd8juht4mp9384,q209c8yqc23n09rhcq823n9t87q432hnq9493q784gth
信息都可以是明文的,因为它本身是没有意义的,而且是通过哈希来验证的,没有秘钥是无法伪造的。为此使用昂贵的 HMAC hash。
- 我正在为我的实时 Web 应用程序开发API使其与移动应用程序一起使用。
- 我想让 access/modify 通过移动应用程序访问我的用户数据。
- 为了避免每次访问用户数据时都向服务器发送用户凭据,我将实施访问令牌。
那又怎样?.. 而不是存储生成的访问令牌详细信息,如 user_id、expiry_time、user_ip 等,在数据库,我将把它们存储在访问令牌本身中。因此,每次用户请求更新时我都可以避免数据库查询。
我正在考虑遵循 API 策略:
- 最初移动应用程序询问用户电子邮件和密码 来自用户并向 API 服务器发送请求以获取访问令牌。
- API 服务器根据数据库检查用户凭据 table。
- 如果用户存在,
- 收集user_id、时间戳、user_ip等,
- 用上述数据格式化逗号分隔的字符串。(或url_encode?)
- encrypt 逗号分隔的字符串 加密密钥(我保证安全) 使用 Mcrypt 库.
- base64_encode加密后的数据和return它作为访问令牌.
- 移动应用存储此 returned 令牌供以后使用。
- 应用程序的进一步请求与令牌一起发送。
- 当API服务器收到带有Token的访问请求时,
- 用相同的加密密钥解密令牌。 (所以,我们将得到相同的逗号分隔字符串)
- 解析解密的定界字符串。我们将得到user_id,时间戳,user_ip.
- 直接使用,
- user_id获取对应的用户数据。
- timestamp检查Token是否过期
- user_ip 决定 allow/deny 如果用户 IP 地址更改。
如果加密失败,我们可以断定它是无效的Access Token。
优点: 当用户请求新数据时,无需每次都查询数据库。因此,节省了时间和资源。
我没有发现这种方法有任何漏洞/问题。那就是我在这里!请提供您宝贵的意见!
注意: 我不知道这是否是访问令牌工作的常见方式。抱歉,如果是的话。
不要将可逆加密交给用户。您将需要为所有用户使用相同的加密密钥,这意味着您拥有一个非常非常机密的密钥,您必须确保它保密。如果此密钥泄露,任何用户都可以通过重新创建您的令牌方案并选择任意用户 ID 来体现任何其他用户。由于您将密码数据交给用户,他们可以轻松地对其发起离线攻击(例如,只需尝试对数据进行任何和所有密钥组合,直到成功解密)。以这种方式发现密钥后,除了更改密钥外别无他法。
相反,使用 hash 专门设计用于减慢这种暴力攻击的程度,以至于它们在实践中变得不可能。使用 签名令牌 实现此功能。这意味着,你使用相同的信息(用户 ID、IP、时间戳),你添加一个 随机生成的值 ,你用你的密钥散列所有这些,然后你发送所有这些部分,除了用户的密钥。
// user_id,ip,timestamp,random_token,hash
42,127.0.0.1,12345678,oiawd8juht4mp9384,q209c8yqc23n09rhcq823n9t87q432hnq9493q784gth
信息都可以是明文的,因为它本身是没有意义的,而且是通过哈希来验证的,没有秘钥是无法伪造的。为此使用昂贵的 HMAC hash。