如何使用在线工具手动验证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
    没有被篡改(尽管可能性不大),然后再存储
    JWT
    ,以便将来调用API。

    这完全是格式和编码的问题

    根据您的输入值和密码获取此令牌:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M
    
    我们想证明签名:

    3pIaKksiX9Zv8Jg-hWbrD24VhL36hBIFaNpA4fVx29M
    
    这是正确的

    签名是一个HMAC-SHA256哈希,它是Base64url编码的。 (如中所述)

    当您使用计算

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
    
    秘密

    hONPMX3tHWIp9jwLDtoCUwFAtH0RwSK6
    
    你得到

    de921a2a4b225fd66ff0983e8566eb0f6e1584bdfa84120568da40e1f571dbd3
    
    因此,它是HMAC-SHA256值,但不是Base64url编码的。此哈希是一个十六进制字符串表示的大数

    要将其与中的值进行比较,需要将其十六进制字符串表示形式中的值转换回数字,并对其进行Base64url编码

    下面的脚本正在这样做,并且还使用crypto js来计算它自己的散列。这也是一种不用JWT库进行验证的方法

    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
    编码,而不是
    base64url
    。 中间还有一些小细节。 这是一份循序渐进的手册,希望能使整个过程更加清晰

    笔记 注意1:必须从JSON字符串(标题和有效负载)中删除所有空格和换行符。 当您生成JWT令牌时,它隐式地在上完成

    注2:要将cryptii.com上的JSON字符串转换为
    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
    
    注3:要在cryptii.com上将HMAC十六进制代码(签名)转换为
    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计算
  • 在上,您可以同时执行
    base64url
    编码/解码和HMAC计算,但对于HMAC,您需要提供一个与上的输入不同的十六进制键,因此我为HMAC计算使用了单独的服务

    输入数据 在本手册中,我使用了以下数据:

    • 标题:

      {"alg":"HS256","typ":"JWT"}
      
      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
      
    • 有效载荷:

      {"sub":"1234567890","name":"John Doe","iat":1516239022}
      
      eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
      
    • 机密(密钥):

    机密未进行
    base64
    编码

    步骤1:转换收割台[工具1]
    • 标题(纯文本):

    • 标题(
      base64url
      encoded):

    步骤2:转换有效载荷[工具1]
    • 有效载荷(纯文本):

    • 有效负载(
      base64url
      encoded):

    步骤3:计算HMAC代码(签名)[工具2] 使用
    SHA256
    算法计算HMAC

    • 输入字符串(
      base64url
      encoded头和有效负载,用点连接):

    • 计算代码(十六进制数):

    计算出的HMAC代码是签名的十六进制表示。 注意:它不应作为pl编码到
    base64url
    {"sub":"1234567890","name":"John Doe","iat":1516239022}
    
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
    
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
    
    c8a9ae59f3d64564364a864d22490cc666c74c66a3822be04a9a9287a707b352
    
    c8a9ae59f3d64564364a864d22490cc666c74c66a3822be04a9a9287a707b352
    
    yKmuWfPWRWQ2SoZNIkkMxmbHTGajgivgSpqSh6cHs1I
    
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
    
    yKmuWfPWRWQ2SoZNIkkMxmbHTGajgivgSpqSh6cHs1I
    
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.yKmuWfPWRWQ2SoZNIkkMxmbHTGajgivgSpqSh6cHs1I