JOSE、JWA、JWE、JWK、JWS 和 JWT 之间有什么区别?它们之间有何关系?
我正在尝试用Java实现Diffie-Hellman密钥交换,但我很难理解规范:
根据JWA(RFC 7518)在直接密钥协商模式下使用曲线P-256,dT和QC完成Diffie-Hellman密钥交换过程作为本地机制,以生成一对CEK(每个方向一个),这些CEK由Transaction标识ID.此版本规范支持的参数值为:
- "alg":ECDH-ES
- "apv":SDK参考编号
- "epk":QC,采用JSON Web Key(JWK)格式
- {"kty":"EC""crv":"P-256"}
- 所有其他参数:不存在
- CEK:"kty":oct - 256位
创建以下数据的JSON对象作为要签名的JWS有效内容:
{"MyPublicKey":"QT","SDKPublicKey":"QC"}
使用JWS Compact Serialization根据JWS(RFC 7515)生成完整JSON对象的数字签名.此版本规范支持的参数值为:
- "alg":PS256或ES256
- "x5c":X.5C v3:Cert(MyPb)以及可选的链接证书
根据我的理解,ECDH将生成一个密钥.在共享我的短暂公钥(QT)之后,SDK生成相同的密钥,因此我们以后可以交换使用相同密钥加密的JWE消息.
JSON {"MyPublicKey":"QT","SDKPublicKey":"QC"}将被签名并发送,但我不明白我将如何使用apv和epk,因为这些标题参数在JWE中使用而不是在第一个JWS将被共享.
在相同的规范中,他们谈论这些JWE消息,但他们没有这些apv和epk参数.
根据JWE(RFC 7516)使用SDK使用的相同"enc"算法加密JSON对象,获得的CEK由"kid"和JWE Compact Serialization识别.此版本规范支持的参数值为:
- "alg":dir
- "enc":A128CBC-HS256或A128GCM
- "kid":交易ID
- 所有其他参数:不存在
我还阅读了RFC 7518中的示例,其中我可以看到标题params apv和epk正在使用但是我不确定哪个标题参数,JWE或JWS?
关于如何使用nimbus-jose-jwt或任何其他java库实现这一点的任何想法都会非常有用.谢谢
我正在寻找一种在Node.js服务中使用JSON Web加密(JWE)的方法.然而,我只是设法找到相关标准JWS的实现.但是有几个其他语言的库,例如jose4j.
有没有人在Javascript中成功实现JWE?我担心我会使用较低级别的原语来实现规范.有更好的方法吗?
根据RFC 7516,应该可以加密有效载荷/声明,称为JWE.
有没有支持它的python库?
我已经检查了PyJWT,python-jose和jwcrypto,但他们都只是用HS256(JWS)签名的例子.
对不起,如果这是非常明显的,但是当谈到涉及加密的事情时,我会格外谨慎.
我有这个问题,我通过这种方式使用 EncryptingCredentials 在 .net 核心中创建了一个 JWE:
var key = Encoding.ASCII.GetBytes(Configuration["Core:JwtSecret"]);
var encryptionkey = Encoding.ASCII.GetBytes(Configuration["Core:JwtEncrype"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = subject,
Expires = DateTime.UtcNow.AddDays(Convert.ToInt32(Host.Config["Core:JwtDays"])),
SigningCredentials =
new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
EncryptingCredentials =
new EncryptingCredentials(new SymmetricSecurityKey(encryptionkey), SecurityAlgorithms.Aes128KW, SecurityAlgorithms.Aes128CbcHmacSha256)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
user.Token = tokenHandler.WriteToken(token);
Run Code Online (Sandbox Code Playgroud)
如何使用 angular 读取令牌的数据?
我一直在阅读JSON Web加密(JWE)规范,最新的草案是08,因为我们正在考虑在我们的身份验证服务器中支持JSON Web令牌(JWT).
使用它定义的非对称加密方法,使用收件人公钥加密对称密钥(内容主密钥).这是有道理的,这样只有收件人才能解密它,并确保令牌是为他们准备的.
通常情况下我还希望也看到一些证明令牌是谁从,例如使用发行人可使用其公钥来验证私钥创建的签名.但是,签名似乎也来自内容主密钥或收件人的公钥,而没有提及发行者的私钥.
如果没有这个,我觉得 - 只要知道预期的令牌格式是已知的 - 拥有收件人公钥的任何人(即任何人)都可以生成有效令牌; 不只是受信任的身份验证服务器
我不是密码学方面的专家(远非它)所以我确定我在这里遗漏了一些东西.收件人如何验证非对称加密令牌是否来自受信任的颁发者?
鉴于JSON Web签名(JWS)规范确实定义了使用发行者私钥并且可以使用其公钥进行验证的签名,我想知道JWE令牌的有效负载是否应该是JWS令牌?
查看RFC 7515和RFC 7516,我试图了解 JWE 的正确 mime 类型应该是什么。看起来 JWE 和 JWS 共享 JOSE 标头信息,并且 JWS 将其 mime 类型定义为application/jose. JWE 没有明确的媒体类型信息。但由于名称是“jose”并且都使用 JOSE 标头,我假设两者应该使用相同的 mime 类型(也因为 JOSE 代表...签名和加密)。
在这种情况下,如何区分签名和/或加密的消息?按财产价值alg?或者通过财产的存在/价值enc?
总结一下:
我正在使用Jose库来创建 JWE。我已经成功地创建并解析了 JWE。JWT 具有exp、iat 等字段,有助于在一段时间后使令牌失效。
如何在 JWE 上设置过期时间?
这是我尝试过的,没有exp:
package main
import (
jose "gopkg.in/square/go-jose.v2"
)
// len(key) is 32
func CreateJWE(value, key string)(string, error){
encrypter, err := jose.NewEncrypter(jose.A256GCM, jose.Recipient{Algorithm: jose.A256GCMKW, Key: []byte(key)}, nil)
if err != nil {
return "", err
}
object, err := encrypter.Encrypt([]byte(value)])
if err != nil {
return "", err
}
return object.FullSerialize(), nil
}
func ParseJWE(jwe, key string)(string, error){
object, err := jose.ParseEncrypted(jwe)
if err != nil { …Run Code Online (Sandbox Code Playgroud) 我使用以下代码来发行我的 JWE:
var signCreds = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:SigningKey"])), SecurityAlgorithms.HmacSha256);
var encryptionCreds = new EncryptingCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Encryptionkey"])), SecurityAlgorithms.Aes128KW, SecurityAlgorithms.Aes128CbcHmacSha256);
var handler = new JwtSecurityTokenHandler();
var jwtSecurityToken = handler.CreateJwtSecurityToken(
Configuration["Jwt:Issuer"],
Configuration["Jwt:Audience"],
new ClaimsIdentity(claims),
DateTime.UtcNow,
expiresIn,
DateTime.UtcNow,
signCreds,
encryptionCreds);
Run Code Online (Sandbox Code Playgroud)
但它没有指定令牌的“cty”标头 - 仅指定 alg、enc 和typ。如果我理解正确,则必须为加密的 JWT 设置标头,因此由于标头缺失,我在解析 golang 中的令牌时遇到问题。
我还尝试了以下几种方式来发行JWE:
var signCreds = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:SigningKey"])), SecurityAlgorithms.HmacSha256);
var encryptionCreds = new EncryptingCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Encryptionkey"])), SecurityAlgorithms.Aes128KW, SecurityAlgorithms.Aes128CbcHmacSha256);
var handler = new JwtSecurityTokenHandler();
var tokenDescriptor1 = new SecurityTokenDescriptor
{
Audience = "you",
Issuer = "me",
Subject = new …Run Code Online (Sandbox Code Playgroud) 我正在使用 node-jose v0.11.0 ( https://www.npmjs.com/package/node-jose ) 进行 JWK 和 JWE 操作。我有一个 JWK 格式的 RSA 密钥,我可以将其加载到 JWK 密钥存储中并再次提取。但是,当我尝试加密任何内容时,我会遇到“错误 2”、“不支持的算法”。RSA 怎么可能是不受支持的算法?
import * as jose from "node-jose";
const webkey = {
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"kid": "a024254d-0321-459f-9530-93020ce9d54a",
"key_ops": [
"encrypt"
],
"n": "jkHgYN98dlR2w7NX-gekCWaCdbxs7X4XXh52DVQrK--krwUYqRbBIUEw1bV8KX0ox6TLt-e6wpYsYYFUItSd5ySqohHRMq1IhyE2zpEC95BA9V7VrFUYnczf1bd5c-aR079aoz5JPXfqx01TzNfxWBb04SlRjsmJeY1v6JrDUI5U0FSOmnJTb3tSS6Szrvi_qOyViYp4v9V2_OVYy45kF_LQQy-pr-kP4gapXL235cieeTW6UvkhzaPT2D-JKyzVjjjgnfRXr8Ox9I9c4wpef2-5nPPeafB5EnOMpJE11KzO_8xxiTGUywPPLQagBvY35gkhQbYS2dv3NGIVSLZHFw"
}
]
};
console.log("webkey", webkey);
//generate key store from public JWK
jose.JWK.asKeyStore(webkey)
.then((result) => {
console.log("Key Store", JSON.stringify(result.toJSON()));
let keyStore = result;
//get the key to encrypt
const encryptionKey: jose.JWK.Key = keyStore.get(webkey.keys[0].kid);
const output = jose.util.base64url.encode("Hello …Run Code Online (Sandbox Code Playgroud) jwe ×10
jwt ×6
encryption ×3
c# ×2
cryptography ×2
jwk ×2
node.js ×2
.net ×1
.net-core ×1
angular ×1
bearer-token ×1
ecdh ×1
go ×1
java ×1
javascript ×1
jose ×1
json ×1
mime-types ×1
pyjwt ×1
python ×1
python-jose ×1
rfc ×1
security ×1