Encryption ES256的JWT签名无效

Encryption ES256的JWT签名无效,encryption,jwt,sha256,ecdsa,secp256r1,Encryption,Jwt,Sha256,Ecdsa,Secp256r1,我正在尝试手动创建ES256 JWT令牌。我有一个用python编写的小脚本,它对使用。但签名在上无效 复制步骤: 创建base64标头+有效负载: EYJHBGCOIJFUZI1NIISINR5CCI6IKPxVCJ9 从base64标头+有效负载创建SHA256哈希: FFC89E33091FFDD3C61798A0A74BF7C2D1A6FD231A6CB519F33952F7696BBE9F 生成ec_私钥: openssl ec-in ec_private.pem-noout-text

我正在尝试手动创建ES256 JWT令牌。我有一个用python编写的小脚本,它对使用。但签名在上无效

复制步骤:

  • 创建base64标头+有效负载:
  • EYJHBGCOIJFUZI1NIISINR5CCI6IKPxVCJ9

  • 从base64标头+有效负载创建SHA256哈希:
  • FFC89E33091FFDD3C61798A0A74BF7C2D1A6FD231A6CB519F33952F7696BBE9F

  • 生成ec_私钥:
  • openssl ec-in ec_private.pem-noout-text

  • 使用小型python程序对SHA256哈希进行ecdsa签名
  • 来自json导入转储的
    
    从ellipticcurve.ecdsa导入ecdsa
    从ellipticcurve.privateKey导入privateKey
    导入base64
    def toBase64Url(输入):
    返回输入。替换(“+”,“-”)。替换(“/”,“”).rstrip(=”)
    #从PEM字符串生成privateKey
    privateKey=privateKey.fromPem(“”)
    -----开始EC参数-----
    BgUrgQQACg==
    -----结束EC参数-----
    -----开始EC私钥-----
    MHcCAQEEIJfChy9fKFItzqcb8DKBm+2oh0YTZ7N61SQPYABGVZANOAGCCQGSM49
    AWEHOUQQGAE1TG2UVIMDFWKTEIDEWHNYBQ NSW/0uoYcvX4Z7ROUIgYRvgfpsjBa
    IV70SUYPMBL0AUEBOXIVTCLCME6SDEQ==
    -----结束EC私钥-----
    """)
    #从json创建消息
    message=“FFC89E33091FFDD3C61798A0A74BF7C2D1A6FD231A6CB519F33952F7696BBE9F”
    签名=Ecdsa.sign(消息,私钥)
    #在base64中生成签名。该结果可以作为数字签名参数发送到请求头中的Stark Bank。
    打印(“Base64:+signature.toBase64())
    打印(“Base64Url:+toBase64Url(signature.toBase64()))
    #要再次检查消息是否与签名匹配,请执行以下操作:
    publicKey=privateKey.publicKey()
    打印(“哈希验证成功:+str(Ecdsa.verify(消息、签名、公钥)))
    
    输出:

    Base64:Meqcifip4iozghzgfdcpx6fvxjtb+nrxdvhotqwdc5vu8z4eaibnalfghqdao3nctqimpahf+IHzxk8em+OMMHrJkPOhA==

    Base64Url:MEQCIFIP4IOZGHZGFDCX6FVXJTB-NRXDVHOTQWDC5VU8Z4EAIBNALFGHQDAO3NCTQIMPAHF-IHzxk8em-OMMHrJkPOhA

    哈希验证成功:True

  • 检查中的签名是否为无效签名
  • eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.EYJZDWIiIxMJ0Nty3OdKwiiBmFtzSi6IKPvAg4GrG9LiiWiyWrTaw4IonryDwUSIMLCI6TuxNjizotaymn0.Meqcifip4IOZGHZGFDCP6FVvxJTB-NRXDVHOTQWDC5Vu8Z4IbNALfQDAO3NcTqIMPAHF-IHZK8EM-OMHRJKPOHA

    键:

    公众:

    -----开始公钥----- Mfkwewyhkozizj0cqyikozizj0daqcdqgae1tg2uvimdfwktiedwehnybqnsw/0 UOYCVX4Z7RUIGYRVGFPSJBAIV70SUYPMBL0AUEBOXIVTCLCME6SDEQ== -----结束公钥-----

    私人:

    -----开始EC私钥----- MHcCAQEEIJfChy9fKFItzqcb8DKBm+2oh0YTZ7N61SQPYABGVZANOAGCCQGSM49 AWEHOUQQGAE1TG2UVIMDFWKTEIDEWHNYBQ NSW/0uoYcvX4Z7ROUIgYRvgfpsjBa IV70SUYPMBL0AUEBOXIVTCLCME6SDEQ== -----结束EC私钥-----

    我知道有很多jwt签名python库,但使用它是为了了解jwt令牌是如何创建的

    编辑:

    正如@Topaco指出的,该库使用曲线secp256k1而不是secp256r1。secp256r1 | prime256v1 | NIST P-256是不同标准组织为同一条曲线选择的所有不同名称()。我将库更改为,代码更改为:

    来自ecdsa导入签名密钥,NIS256P
    导入base64
    def toBase64Url(输入):
    返回输入。替换(“+”,“-”)。替换(“/”,“”).rstrip(=”)
    sk=从_pem(“”)签名密钥
    -----开始EC私钥-----
    MHcCAQEEIJfChy9fKFItzqcb8DKBm+2oh0YTZ7N61SQPYABGVZANOAGCCQGSM49
    AWEHOUQQGAE1TG2UVIMDFWKTEIDEWHNYBQ NSW/0uoYcvX4Z7ROUIgYRvgfpsjBa
    IV70SUYPMBL0AUEBOXIVTCLCME6SDEQ==
    -----结束EC私钥-----
    """)
    vk=验证密钥。从_pem(“”)
    -----开始公钥-----
    Mfkwewyhkozizj0cqyikozizj0daqcdqgae1tg2uvimdfwktiedwehnybqnsw/0
    UOYCVX4Z7RUIGYRVGFPSJBAIV70SUYPMBL0AUEBOXIVTCLCME6SDEQ==
    -----结束公钥-----
    """)
    签名=签名(b“FFC89E33091FFDD3C61798A0A74BF7C2D1A6FD231A6CB519F33952F7696BBE9F”)
    打印(base64.b64编码(签名))
    打印(“Base64:+Base64.b64编码(签名)。解码(“utf-8”))
    打印(“Base64Url:+toBase64Url(base64.B64编码(签名)。解码(“utf-8”)))
    断言vk.验证(签名,b“FFC89E33091FFDD3C61798A0A74BF7C2D1A6FD231A6CB519F33952F7696BBE9F”)
    打印(“哈希验证成功:+str(vk.验证(签名,b“FFC89E33091FFDD3C61798A0A74BF7C2D1A6FD231A6CB519F33952F7696BBE9F”))
    
    输出:

    Base64:RMB GC0ISMGDD5RD7N1L+LDsQ2UO5+cjBwPNYh+xBZvO6fKoJIfmfyNpxw+kxmyKWlK+55dF5eMH1u327DMJvvA==

    Base64Url:RMB0ISMGDD5RD7N1L-LDsQ2UO5-cjBwPNYh-xBZvO6fKoJIfmfyNpxw-kxmyKWlK-55dF5eMH1u327DMJvvA

    哈希验证成功:True


    但是签名仍然无效。

    您正在隐式使用哈希的库,默认情况下应用SHA1。即,为了与ES256兼容,必须明确指定SHA256,并且必须使用未剪切的JWT,例如:

    从ecdsa导入签名密钥,验证密钥
    导入base64
    从hashlib导入sha256
    def toBase64Url(输入):
    返回输入。替换(“+”,“-”)。替换(“/”,“”).rstrip(=”)
    jwt=b“eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.EYJZDWIOiIXMJ0Nty3ODKWIBMFTZSI6IKPVAG4RG9LIIWIYWRTAW4IonryDWUSIMLCI6MTUXNJIZOTAYM0”
    sk=从_pem(“”)签名密钥
    -----开始EC私钥-----
    MHcCAQEEIJfChy9fKFItzqcb8DKBm+2oh0YTZ7N61SQPYABGVZANOAGCCQGSM49
    AWEHOUQQGAE1TG2UVIMDFWKTEIDEWHNYBQ NSW/0uoYcvX4Z7ROUIgYRvgfpsjBa
    IV70SUYPMBL0AUEBOXIVTCLCME6SDEQ==
    -----结束EC私钥-----
    """)
    vk=验证密钥。从_pem(“”)
    -----开始公钥-----
    Mfkwewyhkozizj0cqyikozizj0daqcdqgae1tg2uvimdfwktiedwehnybqnsw/0
    UOYCVX4Z7RUIGYRVGFPSJBAIV70SUYPMBL0AUEBOXIVTCLCME6SDEQ==
    -----结束公钥-----
    """)
    signature=sk.sign(jwt,hashfunc=sha256)
    打印(“Base64:+Base64.b64编码(签名)。解码(“utf-8”))
    打印(“Base64Url:+toBase64Ur