作为一个快速概述,我正在尝试使用 https://github.com/dvsekhvalnov/jose-jwt 库通过 C# 生成 ES256 算法 -JWT 令牌。
根据说明:
ES256、ES384、ES256 ECDSA 签名需要对应长度的 CngKey(通常为私有)椭圆曲线密钥。通常,通过 CngKey.Open(..) 方法从密钥存储提供程序加载现有的 CngKey。但是,如果您想使用原始密钥材料 (x,y) 和 d,则 jose-jwt 提供了方便的 EccKey.New(x,y,d) 帮助程序。
CngKey.Open() 表示它打开现有密钥,但听起来我应该使用 CngKey.Import()?当我尝试调用 CngKey.Import() 时,它返回以下错误:
参数不正确。
基本上,我想问的是将现有的 PEM 文件转换为 Jose.JWT.Encode() 函数所需的 CngKey 对象的最简单方法是什么?任何帮助都将不胜感激。谢谢!
以下是我的代码(出于安全考虑,这不是真正的私钥):
根据说明:
ES256、ES384、ES256 ECDSA 签名需要对应长度的 CngKey(通常为私有)椭圆曲线密钥。通常,通过 CngKey.Open(..) 方法从密钥存储提供程序加载现有的 CngKey。但是,如果您想使用原始密钥材料 (x,y) 和 d,则 jose-jwt 提供了方便的 EccKey.New(x,y,d) 帮助程序。
CngKey.Open() 表示它打开现有密钥,但听起来我应该使用 CngKey.Import()?当我尝试调用 CngKey.Import() 时,它返回以下错误:
参数不正确。
基本上,我想问的是将现有的 PEM 文件转换为 Jose.JWT.Encode() 函数所需的 CngKey 对象的最简单方法是什么?任何帮助都将不胜感激。谢谢!
以下是我的代码(出于安全考虑,这不是真正的私钥):
public string GenerateToken(int contactID, Database _db)
{
var contact = GetContact(contactID, _db);
var payload = new Dictionary<string, object>()
{
{"broker", 1},
{"contact_id", contact.id},
{"name", contact.fname + " " + contact.lname + ""},
{"iss", "www.somewhere.com"},
{"iat", (DateTime.Now - UnixEpoch).TotalSeconds},
{"nbf", (DateTime.Now - UnixEpoch).TotalSeconds},
{"exp", (DateTime.Now.AddDays(30) - UnixEpoch).TotalSeconds}
};
string privateKey =
"MHcCAQEffEIIIHHHHHHHHHHHHHHHffHHHHHHHHHHHHHHHHHHHHHHHoGgCCqGSM49" +
"AwEHhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhI+pRkAxAb13" +
"77vz2Yjjjjjjjjjjjjjjjjjjjjw==";
byte[] b = Convert.FromBase64String(privateKey);
CngKey cng = CngKey.Import(b, CngKeyBlobFormat.EccPrivateBlob);
string token = Jose.JWT.Encode(payload, cng, JwsAlgorithm.ES256);
return token;
}
Base64UrlEncode()
到底是做什么的?首先编码为 base64 然后进行 url 编码?还是相反的顺序? - user2173353exp
是过期时间(Unix 时间戳)。您可以使用自己选择的编程语言来生成它。至于Base64UrlEncode()
,可以查看 https://dev59.com/04rda4cB1Zd3GeqPR922#30246618。 - Shawinder Sekhon