.NET 中使用 RSA 的简单签名令牌机制

问题描述 投票:0回答:2

我正在尝试构建一个简单的身份验证机制来授权或拒绝对我的微服务应用程序上特定端点的调用。

这个想法是只允许从微服务 X 到 Y 的某些调用,为此我想生成一个 RSA 密钥对并使用私钥来加密令牌并让微服务使用公共密钥来解密一次收到了。

为了实现这一目标,我构建了一个包含两个字段的 JSON 令牌:颁发者和过期时间。

然后我用私钥对令牌进行签名:

using (var rsa = RSA.Create())
{
    rsa.ImportFromPem(PrivateKey);

    var token = AuthMaintenanceToken.CreateToken();//the json string token
    byte[] encodedToken = Encoding.UTF8.GetBytes(token);

    byte[] encryptedToken = rsa.SignData(encodedToken, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);

    return Convert.ToBase64String(encryptedToken);
}

然后我将令牌作为 http 请求中的标头“xyx”发送到微服务。

现在在端点上,我从 http 标头获取令牌,我必须“解密”它并检查其字段。

我怎样才能实现这个目标?我感觉我没有走在正确的道路上。

.net encryption rsa
2个回答
0
投票

您可以像这样分离数据:

{
    "authData":{ 
        "issuer": "mywebsite.com",
        "expTime": 01/01/2023
     },
    "signature":"Your signature"
}

之后,您可以仅获取 authData,对其进行签名并将结果放入签名字段。该 JSON 可以编码为 base64,并放入 HTTP 标头。

目标服务收到 HTTP 请求:

  1. 使用您的数据读取 HTTP 身份验证标头
  2. 读取authData
  3. 读取签名并通过公钥进行检查。如果相同(如 authData),则请求可以发送到下一阶段。

要实施验证,您可以使用

您也可以查看这篇关于 RSA 的文章


0
投票

首先,您需要了解加密和数字签名之间的区别

为此,我想生成一个 RSA 密钥对并使用私钥 加密token,让ms用公开的token解密一次 收到了。

数字签名是一种方式,一旦签名你将无法检索原始数据,这主要用于不可否认。我相信您正在寻求使用加密,因为您想要检索加密的原始数据。

旁注: 在加密中,公钥用于加密和 私钥用于解密

这就是我如何加密和解密这个令牌。

using (var rsa = RSA.Create())
{
    rsa.ImportFromPem(privateKey);
    // Encrypt and decrypt a message
    var token = "TOKEN";
    var encryptedToken= Encryptor.EncryptMessage(token, rsa);
    var decryptedToken = Encryptor.DecryptMessage(encryptedToken, rsa);

    Console.WriteLine("Original token: " + token);
    Console.WriteLine("Encrypted token: " + Convert.ToBase64String(encryptedToken));
    Console.WriteLine("Decrypted token: " + decryptedToken);
}

Encryptor.cs

public static class Encryptor
 {
     public static byte[] EncryptMessage(string message, RSA rsa)
     {
         byte[] encodedMessage = Encoding.UTF8.GetBytes(message);
         byte[] encryptedMessage = rsa.Encrypt(encodedMessage, RSAEncryptionPadding.Pkcs1);

         return encryptedMessage;
     }

     public static string DecryptMessage(byte[] encryptedMessage, RSA rsa)
     {
         byte[] decryptedMessage = rsa.Decrypt(encryptedMessage, RSAEncryptionPadding.Pkcs1);
         string originalMessage = Encoding.UTF8.GetString(decryptedMessage);

         return originalMessage;
     }
    
 }
© www.soinside.com 2019 - 2024. All rights reserved.