我正在尝试构建一个简单的身份验证机制来授权或拒绝对我的微服务应用程序上特定端点的调用。
这个想法是只允许从微服务 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 标头获取令牌,我必须“解密”它并检查其字段。
我怎样才能实现这个目标?我感觉我没有走在正确的道路上。
您可以像这样分离数据:
{
"authData":{
"issuer": "mywebsite.com",
"expTime": 01/01/2023
},
"signature":"Your signature"
}
之后,您可以仅获取 authData,对其进行签名并将结果放入签名字段。该 JSON 可以编码为 base64,并放入 HTTP 标头。
目标服务收到 HTTP 请求:
要实施验证,您可以使用
您也可以查看这篇关于 RSA 的文章
首先,您需要了解加密和数字签名之间的区别。
为此,我想生成一个 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;
}
}