Acc*_*Rpa 6 .net c# encryption sign jose
我是 jwt 的新手,在阅读了大量网页后,我没有找到如何使用从该网站https://mkjwk.org/生成的密钥对生成令牌(签名和加密)的示例。我认为这不会很困难。我认为这是生成签名令牌的方法(我不知道是否正确):
RSACryptoServiceProvider rsaCrypto = new RSACryptoServiceProvider();
var payload = new Dictionary<string, object>()
{
{"jti", "ORIGEN_" + Guid.NewGuid().ToString()},
{"iat", DateTime.UtcNow},
{"exp", DateTime.UtcNow.AddYears(1)},
{"login", "USER" },
{"password", "PASSWORD" },
{"origen", "ORIGEN" }
};
// Contains both public and private keys to sign
var headers = new Dictionary<string, object>()
{
{ "kty", "RSA" },
{ "d", "A7Q8cttv_CSG4CJkX_xlU5lUoeRrCPZpyZx9eVaD7zi-tE7wDPKNmJPRP6uR_LA2YVXMmfY9w8q1_v_MiYxkYnFgZqNZlKdwucSQUlnfX5Tt806qh_323h5NnHrKweL-98_d8R4RuZXCWEQ3X0QDCVfccaLVVqLJy8S5zlx0aAVuBJxLxBHFRO700qdUN-RaMjHULoOnE1KbwmfKPfGlLL0YWPHQ9t-qIBh6OSZsDZh30K4VLF8sRXkGgn81_Byp4hK9tCfG98R6fWUM2_FCQrC9R1hO-KTsLffRzMboWe-2ymZGQfZKO-gtFaQH7_AjdVnQYMyKhSSCGYAAroSZAQ"},
{ "e", "AQAB" },
{ "use", "enc"},
{ "kid", "RPA" },
{ "alg", "RS256" },
{ "n", "qJPwMcHtb7xFGGczn20IiEtrPVehquyT6lxIJa_e4vcZE33uM6myVZWocTZWzTDmrNT3bJghEpLOhrgYatT3QnJIiTM9KAD01kYPc5cP5yo6Wmu0YjivqL3Rj7dUvi2pvl7juwYxt1_8zfdnBN5GpBIYcaY3ulVo_OSL7TOxJrua5IMhilQz6kqta3-Rgz3GSglOs94RHRvorYxMyHPQ6KhwSlh_zLzJQZ-0-AZ4yaMPdVwEaaEJpL-odYmRudX4E0t42dExLf_q1rpRfvTcdFSwfsJ7FmQcOtlc340WUgr4BHJfwrNIE4i-TFqrB4zSQJVKHlBfLeGKiYZQPD7igw" }
};
string tokenSigned = JWT.Encode(payload, rsaCrypto, JwsAlgorithm.RS256, headers);
Run Code Online (Sandbox Code Playgroud)
我得到一个令牌(我认为已签名),但如果我将此令牌放入此网站https://jwt.io/,我会收到错误“无效签名”。我还想用公钥加密这个令牌。所以我这样做:
// Another public key to encrypt
headers = new Dictionary<string, object>()
{
{ "kty", "RSA" },
{ "e", "AQAB" },
{ "use", "enc"},
{ "alg", "RS256" },
{ "n", "ldMvqNDlz8-ABqEhqjtT0qvjKKbJMQ4J6GEi-7QrY-EUtyjCE7cOriHrYmbjt3o3zXwUTyOp0-twnF5j1HXFwVk7_XNsZz7LUmGNtmnqgB2iw2xhS7LAicN0RRgIbxWRDLOaaZ-49QumX6_r_jLNtIspKiFiuUNf2s0ipeAjWBFquiiqTMBd98z3pS-vC5y0CfzPbTSLSinikrHkIW2uO4FNHWZpoo8npn7vwWtAJjknWhaFi2s9P5kzUk4Mpbdx4DxUJ9ZvUi9SmdvH2vUzwGe0lxyvlw0DAMMWAT9TmsiKzBeXTY6rQ1-2Edn4F9S5kkPNOh1NqJoebz50-Bpl6w" }
};
string tokenEncrypted = JWT.Encode(payload, tokenSigned , JweAlgorithm.RSA_OAEP, JweEncryption.A256GCM, extraHeaders: headers);
Run Code Online (Sandbox Code Playgroud)
但我总是收到错误“RsaKeyManagement alg 期望密钥为 RSACryptoServiceProvider 类型。”。我已经搜索过此错误,但没有任何明确的信息。请问,有人可以帮助我吗?我不确定我是否走在正确的道路上。
我将 jose-jwt 用于 .net,因为我读到库 System.IdentityModel.Tokens.Jwt 无法加密。
谢谢。问候。
在本例中,我有一个 jwk,我想用我的私钥对其进行签名,并使用c# jose-jwt 库的客户公钥对其进行加密。这个jwk一直都是一样的,所以我只需要生成一次。为此,您需要创建一个 RSA 对象,然后使用库的 Encode 方法进行签名和加密。jwk 有几个参数:
JSON Web Key (JWK):表示加密密钥的 JSON 对象。对象的成员表示键的属性,包括其值。这些是一些参数:
p = 'RSA 秘密素数'; kty = '密钥类型'; q = 'RSA 秘密质数'; d = 'RSA 秘密指数'; e = 'RSA 公共指数'; 孩子= '钥匙 ID'; n = 'RSA 公共模数'; use = '公钥使用'; alg = '算法'
但就我而言,我只有其中的一些:d、e、n、kty、use、kid、alg。问题是,如果您有 e 和 d 参数,您还需要p 和 q,因为您无法在没有素数(P 和 Q)的情况下使用 .NET 构造私钥。
解决方案是将问题分为两部分:
JAVA部分:使用Nimbus JOSE+JWT JAVA库创建一个完整的jwk :
C# 部分:使用之前的 jwk 通过c# jose-jwt 库在 C# 中创建 RSA 对象。像这样:
var js = new JavaScriptSerializer();
// json is the result returned by java
var jwk = js.Deserialize<IDictionary<string, string>>(json);
byte[] p = Base64Url.Decode(jwk["p"]);
byte[] q = Base64Url.Decode(jwk["q"]);
byte[] d = Base64Url.Decode(jwk["d"]);
byte[] e = Base64Url.Decode(jwk["e"]);
byte[] qi = Base64Url.Decode(jwk["qi"]);
byte[] dq = Base64Url.Decode(jwk["dq"]);
byte[] dp = Base64Url.Decode(jwk["dp"]);
byte[] n = Base64Url.Decode(jwk["n"]);
RSA key = RSA.Create();
RSAParameters keyParams = new RSAParameters();
keyParams.P = p;
keyParams.Q = q;
keyParams.D = d;
keyParams.Exponent = e;
keyParams.InverseQ = qi;
keyParams.DP = dp;
keyParams.DQ = dq;
keyParams.Modulus = n;
key.ImportParameters(keyParams);
Run Code Online (Sandbox Code Playgroud)
拥有 RSA 对象后,您可以对其进行签名:
var payload = new Dictionary<string, object>()
{
{"user", USER },
{"password", PASSWORD }
};
string tokenSigned = JWT.Encode(payload, key, JwsAlgorithm.RS256);
Run Code Online (Sandbox Code Playgroud)
您可以在库作者网页中找到原始解决方案。
问候。
| 归档时间: |
|
| 查看次数: |
15184 次 |
| 最近记录: |