如何使用在线工具手动验证JWT签名
据我所知,验证如何使用在线工具手动验证JWT签名,jwt,Jwt,据我所知,验证JWT签名是一个简单的过程。但是,当我使用一些在线工具为我做这件事时,它并不匹配。如何在不使用JWT库的情况下手动验证JWT签名?我需要一个快速的方法(使用可用的在线工具)来演示如何做到这一点 我使用以下信息在上创建了我的JWT: 算法:HS256 秘密:hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6 标题: { "alg": "HS256", "typ": "JWT" } 我得到: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ
JWT
签名是一个简单的过程。但是,当我使用一些在线工具为我做这件事时,它并不匹配。如何在不使用JWT库的情况下手动验证JWT
签名?我需要一个快速的方法(使用可用的在线工具)来演示如何做到这一点
我使用以下信息在上创建了我的JWT
:
- 算法:
HS256
- 秘密:
hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6
- 标题:
{
"alg": "HS256",
"typ": "JWT"
}
我得到:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.wDQ2mU5n89f2HsHm1dluHGNebbXeNr748yJ9kUNDNCA
ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5.ZXlKemRXSWlPaUl4TWpNME5UWTNPRGt3SWl3aWJtRnRaU0k2SWtwdmFHNGdSRzlsSWl3aWFXRjBJam94TlRFMk1qTTVNREl5ZlE=
这让我感到:
a2de322575675ba19ec272e83634755d4c3c2cd74e9e23c8e4c45e1683536e01
A2DE32257567BA19EC272E83634755D4C3C2CD74E9E23C8E4C45E1683536E01
这与JWT的签名部分不匹配:
=WDQ2MU5N89F2HSHM1DLUGNEBBXENR748YJ9KUNDNCAM
A2DE32257567BA19EC272E83634755D4C3C2CD74E9E23C8E4C45E1683536E01
目的: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.wDQ2mU5n89f2HsHm1dluHGNebbXeNr748yJ9kUNDNCA ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5.ZXlKemRXSWlPaUl4TWpNME5UWTNPRGt3SWl3aWJtRnRaU0k2SWtwdmFHNGdSRzlsSWl3aWFXRjBJam94TlRFMk1qTTVNREl5ZlE= 我需要确认这一点的原因是为了证明能够验证
没有被篡改,而不解码JWT
JWT
我的客户端web界面不需要解码
,因此他们不需要为此安装JWT包。他们只需要做一个简单的验证来确认JWT
没有被篡改(尽管可能性不大),然后再存储JWT
,以便将来调用API。这完全是格式和编码的问题 根据您的输入值和密码获取此令牌:JWT
我们想证明签名:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M
这是正确的 签名是一个HMAC-SHA256哈希,它是Base64url编码的。 (如中所述) 当您使用计算3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M
秘密eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
你得到hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6
因此,它是HMAC-SHA256值,但不是Base64url编码的。此哈希是一个十六进制字符串表示的大数 要将其与中的值进行比较,需要将其十六进制字符串表示形式中的值转换回数字,并对其进行Base64url编码 下面的脚本正在这样做,并且还使用crypto js来计算它自己的散列。这也是一种不用JWT库进行验证的方法de921a2a4b225fd66ff0983e8566eb0f6e1584bdfa84120568da40e1f571dbd3
结果是:var CryptoJS=require(“CryptoJS”); //输入值 var base64Header=“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9”; var base64Payload=“eyjzdwiiixmjm0nty3odkwiiijbmftzsi6ikpvag4grg9liiwiawf0ijoxnte2mjm5mdiyfq”; var secret=“hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6”; //来自不同在线工具的两个哈希 var signatureJWTIO=“3piakksi9zv8jg-hWbrD24VhL36hBIFaNpA4fVx29M”; var onlineCaluclatedHS256=“DE921A2A4 B225FD66FF0983E8566EB0F6E1584BDFA84120568DA40E1F571DBD3”; //使用Crypto JS进行哈希计算。 //这两个replace表达式通过替换将Base64转换为Base64url格式 //“+”与“-”,“/”与“u”并去除“=”填充 var base64Signature=CryptoJS.HmacSHA256(base64Header+“+base64Payload,secret).toString(CryptoJS.enc.Base64).replace(//\+/g,'-')。replace(//\//g,''''''')。replace(//\=+$/m'); //将联机计算值转换为Base64表示形式 var base64hash=new Buffer.from(onlineCaluclatedHS256,'hex')。toString('base64')。replace(//\//g,''''''.')。replace(//\+/g,'-'))。replace(//\=+$/m',) //结果是: 日志(“来自JWT.IO的签名:”+signatureJWTIO); log(“NodeJS计算哈希:”+base64Signature); console.log(“在线计算哈希(已转换):”+base64hash);
一模一样 结论: 不同在线工具计算的值都是正确的,但由于格式和编码不同,无法直接比较。Signature from JWT.IO : 3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M NodeJS calculated hash : 3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M online calulated hash (converted) : 3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M
如上所示的一个小脚本可能是更好的解决方案。我遇到了同样的问题,直到我发现我使用的是纯
编码,而不是base64
。 中间还有一些小细节。 这是一份循序渐进的手册,希望能使整个过程更加清晰 笔记 注意1:必须从JSON字符串(标题和有效负载)中删除所有空格和换行符。 当您生成JWT令牌时,它隐式地在上完成 注2:要将cryptii.com上的JSON字符串转换为base64url
字符串,请创建以下配置:base64url
First view: Text Second view: Encode Encoding: Base64 Variant: Standard 'base64url' (RFC 4648 §5) Third view: Text
注3:要在cryptii.com上将HMAC十六进制代码(签名)转换为First view: Bytes Format: Hexadecimal Group by: None Second view: Encode Encoding: Base64 Variant: Standard 'base64url' (RFC 4648 §5) Third view: Text
字符串,请创建以下配置:base64url
First view: Text Second view: Encode Encoding: Base64 Variant: Standard 'base64url' (RFC 4648 §5) Third view: Text
手册 您只需要两个在线工具:First view: Bytes Format: Hexadecimal Group by: None Second view: Encode Encoding: Base64 Variant: Standard 'base64url' (RFC 4648 §5) Third view: Text
- [工具1]:-对于
编码base64url
- [工具2]:-用于HMAC计算
在上,您可以同时执行
编码/解码和HMAC计算,但对于HMAC,您需要提供一个与上的输入不同的十六进制键,因此我为HMAC计算使用了单独的服务 输入数据 在本手册中,我使用了以下数据:base64url
- 标题:
{"alg":"HS256","typ":"JWT"}
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- 有效载荷:
{"sub":"1234567890","name":"John Doe","iat":1516239022}
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
- 机密(密钥):
编码 步骤1:转换收割台[工具1]base64
- 标题(纯文本):
- 标题(
encoded):base64url
- 有效载荷(纯文本):
- 有效负载(
encoded):base64url
算法计算HMACSHA256
- 输入字符串(
encoded头和有效负载,用点连接):base64url
- 计算代码(十六进制数):
base64url
{"sub":"1234567890","name":"John Doe","iat":1516239022}
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
c8a9ae59f3d64564364a864d22490cc666c74c66a3822be04a9a9287a707b352
c8a9ae59f3d64564364a864d22490cc666c74c66a3822be04a9a9287a707b352
yKmuWfPWRWQ2SoZNIkkMxmbHTGajgivgSpqSh6cHs1I
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
yKmuWfPWRWQ2SoZNIkkMxmbHTGajgivgSpqSh6cHs1I
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.yKmuWfPWRWQ2SoZNIkkMxmbHTGajgivgSpqSh6cHs1I
- [工具1]:-对于