Encryption ES256的JWT签名无效
我正在尝试手动创建ES256 JWT令牌。我有一个用python编写的小脚本,它对使用。但签名在上无效 复制步骤: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
从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
来自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