你现在的方法是相当糟糕的。考虑一下我(攻击者)是否了解到我的受害者 UUID 有一定的价值x
。然后我可以简单地获取 SHA-256 哈希值x
并将其作为 cookie 存储在您的网站上。多田。我现在正在冒充我的受害者。
话虽如此,为登录系统生成令牌的一种非常安全的方法是相对相似的。考虑以下 JSON 对象:
{ "expiry": "1:30:00 24/10/2012", "userID": "F68D4A77DC34" }
如果我们将此 JSON 对象作为 cookie 存储在客户端,这将是确定我们的用户是谁以及该对象何时过期以及用户需要再次登录的绝佳方法。
但是等等,这行不通,因为任何人都可以更改用户 ID 或过期时间,而您的服务器不会知道!
我们可以通过引入 HMAC 轻松解决这个问题。 HMAC 是哈希消息验证码。我们首先生成(一次,永远)一个随机 HMAC 密钥,k
,在服务器上使用。该密钥应保留在服务器上并且永远不会被传输。
当用户登录时,我们创建一个与上面类似的 JSON 对象,然后通过 HMAC(例如 HMAC-SHA256)将其提供给k
作为键,然后将其结果作为 base64 编码字节附加到 JSON 对象。有时使用分割字符也有帮助,例如“.”。
然后我们得到以下结果:
{ "expiry": "1:30:00 24/10/2012", "userID": "F68D4A77DC34" }.ScvlfpUDqgxtDPH4jsK44d+4cMNG+5yCvASJkVEI11o
完全像这样使用这个令牌就可以了,但有些人也喜欢对 JSON 进行 Base64 编码。在这种情况下我们最终会得到这样的结果:
eyAiZXhwaXJ5IjogIjE6MzA6MDAgMjQvMTAvMjAxMiIsICJ1c2VySUQiOiAiRjY4RDRBNzdEQzM0IiB9.ScvlfpUDqgxtDPH4jsK44d+4cMNG+5yCvASJkVEI11o
通过获取 JSON 对象,再次执行相同的操作,然后将 HMAC 的结果与附加到令牌的结果进行比较,我们可以轻松验证此令牌是否合法。如果它们匹配,我们就知道我们的服务器生成了令牌并且它是合法的。