栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JWT之JAVA-setClaims和Python的区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JWT之JAVA-setClaims和Python的区别

问题分析:

偶然的机会发现在参数相同情况下利用Python(pyjwt)生成的JWT和JAVA服务返回的不同:
Java依赖:

	 
	     io.jsonwebtoken
	     jjwt
	     0.9.1
	 

注意到Java中使用setHeader()和setPayload()方法生成的token和Python中pyjwt的一致。

        .....// 此处省略n行
        JwtBuilder builder = Jwts.builder()
        		.setClaims(payload)
				// .setHeader(header)
				// .setPayload(payload) 
                .signWith(signatureAlgorithm, salt);
        return builder.compact();  //开始压缩为***.***.***格式的JWT
    }

但使用setClaims()时无法达到与pyjwt的加密一致性,以下是setClaims的相关说明:

    
   JwtBuilder setClaims(Map claims);

至此略有眉目,Python应该是通过json.dumps()直接序列化为plaintext string的。
后面通过对解密过程进行追踪,发现Java中对JWT的header部分做了个性化处理:

    public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) {
        Assert.hasText(base64EncodedSecretKey, "base64-encoded secret key cannot be null or empty.");
        byte[] bytes = TextCodec.base64.decode(base64EncodedSecretKey);
        return signWith(alg, bytes);
    }

其中的TextCodec.base64.decode(base64EncodedSecretKey);解密成bytes的操作与Python中base64.decodebytes()相对应;


从两个方面解决均可:

Java方面妥协:
Java中使用setHeader()和setPayload()方法进行加密;Python方面妥协:
Python中对salt进行处理

j_salt = base64.decodebytes(salt.encode('utf-8'))
之后再进行操作。例如:
原来是这样:
sign = base64.urlsafe_b64encode(hmac.new(salt, first_second.encode('utf-8'), hashlib.sha512).digest()).decode('utf-8').replace('=', '')
修改为:
sign = base64.urlsafe_b64encode(hmac.new(j_salt, first_second.encode('utf-8'), hashlib.sha512).digest()).decode('utf-8').replace( '=', '')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755520.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号