【发布时间】:2017-09-15 17:56:35
【问题描述】:
我目前正在学习使用 PHP 实现 JWT,并希望在我的 RESTful 应用程序中使用 JWT 令牌而不是会话。
在签名创建期间,我正在做这样的事情
token = base64Header + '.' + base64Payload + '.' + signature
这里我们只是使用 base64 作为 Payload。如果我粘贴到像 https://jwt.io/#debugger 这样的网站,Payload 会被解密(即使签名错误)。
我的问题,
- 发送数据时JWT是否仅用于验证与服务器的签名?
- 在 Payload 中保存敏感数据是否不安全?
- 如果不安全,有什么方法可以保护 Payload?
下面是我写的示例代码
<?php
$headers = base64_encode(json_encode([
"typ" => "JWT",
"alg" => "HS256"
]));
$claims = base64_encode(json_encode([
"sub" => "1234567890",
"name" => "John Doe",
"admin" => true,
"jti" => "870a3de5-ea7b-4062-abef-11180e530f5a",
"iat" => 1492603378,
"exp" => 1492606978
]));
$payload = $headers.".".$claims;
$signature = base64_encode(hash_hmac("sha256", $payload, 'secret', true));
$encodedJWT = $payload.".".$signature;
// eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg3MGEzZGU1LWVhN2ItNDA2Mi1hYmVmLTExMTgwZTUzMGY1YSIsImlhdCI6MTQ5MjYwMzM3OCwiZXhwIjoxNDkyNjA2OTc4fQ.nvw-bAUgr7H_xr3q8_Yz8rCNtMohtn2YlCmcLoLBWlc
【问题讨论】:
-
请在投票前提供 cmets。如果有什么不对,我会更新我的问题:)
-
嗨,根据我在 JWT 上参加的会议的信息,敏感数据应该保留在数据库中,令牌本身应该只包含快速识别所需的信息,而不是授权。
-
我们应该在投票前提供 cmets 吗? -:) 投反对票很少的原因是因为 SO 版主建议不要因为偶尔的报复投反对票。
-
仅供参考,我删除了“正确”的措辞,转而询问它是否安全。前者更多的是意见(并且可能会被关闭),后者是事实。无论哪种方式都应该得到有用的答案
-
诚然,存储敏感数据可以解决一些可扩展性问题,但作为权衡,您会牺牲应用程序的安全性。 TBH,如果您的有效负载经过编码和加盐+您在 https 上运行,则数据受到损害的可能性不大,但是您永远不会得到任何体面的渗透测试机构的认可,并且如果您的客户必须验证这种方法,则没有这也很有可能获得批准。