从(RSA)公钥手动创建 JWK [英] Manually create JWK from (RSA) PublicKey
问题描述
我需要将 RSA PublicKey 转换为有效的 JWK.特别是 JWK 的值n"和e"是我正在努力解决的问题.在 https://tools 查看示例 JWK 时,编码似乎不正确.ietf.org/html/rfc7517#page-25
目前我的代码基本上是这样的:
private MapgenerateJWK(PublicKey publicKey){RSAPublicKey rsa = (RSAPublicKey) publicKey;映射<字符串,对象>values = new HashMap<>();values.put("kty", rsa.getAlgorithm());//getAlgorithm() 返回 kty 而不是算法values.put("kid", "someuniqueid");values.put("n", Base64.encode(rsa.getModulus().toString()));values.put("e", Base64.encode(rsa.getPublicExponent().toString()));values.put("alg", "RS256");values.put("use", "sig");返回值;}
然而,输出似乎没有正确编码或其他东西,例如 e
看起来像这样:NjU1Mzc=
n
不包括像 -
、_
和 +
这样的特殊字符.:
我是否认为 n 和 e 都没有正确编码?我应该如何将 PublicKey 转换为 JWK?(不能使用第三方库)
JWK 使用与 base64 略有不同的 base64url 编码.此外,不要对 BigInteger
值使用 toString()
方法.直接获取数据为字节数组
改变
Base64.encode(rsa.getModulus().toString())Base64.encode(rsa.getPublicExponent().toString())
到
Base64.getUrlEncoder().encodeToString(rsa.getModulus().toByteArray())Base64.getUrlEncoder().encodeToString(rsa.getPublicExponent().toByteArray())
I need to convert a RSA PublicKey into a valid JWK. Especially the values "n" an "e" of the JWK are the ones I'm struggling with. The encoding does not seem to be correct, when looking at example JWK's at https://tools.ietf.org/html/rfc7517#page-25
Currently my code looks basically like this:
private Map<String, Object> generateJWK(PublicKey publicKey){
RSAPublicKey rsa = (RSAPublicKey) publicKey;
Map<String, Object> values = new HashMap<>();
values.put("kty", rsa.getAlgorithm()); // getAlgorithm() returns kty not algorithm
values.put("kid", "someuniqueid");
values.put("n", Base64.encode(rsa.getModulus().toString()));
values.put("e", Base64.encode(rsa.getPublicExponent().toString()));
values.put("alg", "RS256");
values.put("use", "sig");
return values;
}
The output however does not seem to be correctly encoded or something, e
for example looks like this: NjU1Mzc=
n
does not include special characters like -
, _
and +
. :
jMzk1MNT0xTk2NED1xzzgNyQ00IykADzMAM0c0wz0M0MONj2z5TgNzI3yAM0OONYzzMjzwNzDxgAzxDxzMMAjTwNNDYMINMgNQDOEAkIM2jMQzkjUTDUYONNg1A00Tw1Nx4YEzAzjUT1MTNMjDjMM1MNNAjyTMIzxNADDINQANwT5yTDEMjEzNz2z2gOgjDDDNyNDjTzz43ETOYMI35gDjE00MYYM2DzDjDgww53Mwz0ME1NMgOM3MIzYTzMwzOMIQU5MjOzUjMNQNNg50U5NIDNzw2DMMOggNcQQM21TI5NMzDTN5Mj123O33MNNMkyNTNONxMM5wMMc04jTgAUE3MM1zMg4NNMT4MNDMM5yTO2j4jNDEMy1yNANNAzOIEUDzNwzExwTIkNjUjkN54Uz0DT5x0zM51k2MxYkx0zMNzxMkDUDTTQN3gAYODATQDDwMDMjMMcONjxMNTYMT5kgxNkMjNMQU0jzMEwIIMzTzUD4MgYDkDNzcAzN0TN4yNTz11DMxDUjDM2MyDMy4DEINMwT22QxjNNEzNDATy1OM1NNDxYgz5TxDkj3gQ32kIwNNkDO3xczDAENcTMNO0MOjTDwE3g11wNUcgNTwQk30kjjNNzTz4jTj4OOjQNYzMzcMjTQMkyzNNNUQOTOMMkMMMNzwNxDOEkg4xADIT4DNxMz2TENT4yN4z2I2zjyMU3DTOEQN4MIQjNDMU5Y11QkccwMNI0kNzyNjMMN4NMTTNMzMwxMjjDzgAANO1zwjYIEUjM1ADgDNjxTITMNNkIYxzyzzEEDMzDzNjzM4NjNNjc3ITTD0T5jzN=
Am I assuming right that both values n and e are not properly encoded? How should I convert the PublicKey to JWK? (Can not use 3rd party libraries)
JWK uses base64url encoding which is slighly different to base64. Additionally, do not use toString()
method on BigInteger
values. Get directly the data as byte array
Change
Base64.encode(rsa.getModulus().toString())
Base64.encode(rsa.getPublicExponent().toString())
To
Base64.getUrlEncoder().encodeToString(rsa.getModulus().toByteArray())
Base64.getUrlEncoder().encodeToString(rsa.getPublicExponent().toByteArray())
这篇关于从(RSA)公钥手动创建 JWK的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!