c# - 使用 Azure Key Vault 的密钥加密和解密文本
问题描述
我正在尝试使用 Azure Key Vault 中的密钥来加密和解密 Web API 的 cookie。
对于加密过程,我在该类中使用 RSA:
public class SimpleRSA
{
private RSA _rsa;
public SimpleRSA(RSA rsa)
{
_rsa = rsa;
}
public string EncryptAsync(string value)
{
var byteData = Encoding.Unicode.GetBytes(value);
var encryptedText = _rsa.Encrypt(byteData, RSAEncryptionPadding.OaepSHA1);
var encodedText = Convert.ToBase64String(encryptedText);
return encodedText;
}
public string DecryptAsync(string encryptedText)
{
var encryptedBytes = Convert.FromBase64String(encryptedText);
var decryptionResult = _rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA1);
var decryptedText = Encoding.Unicode.GetString(decryptionResult);
return decryptedText;
}
}
我正在使用该代码从密钥中获取我的 RSA:
public RSA GetRSA(string appId, string appSecret)
{
AuthenticationCallback callback = async (authority, resource, scope) =>
{
var authContext = new AuthenticationContext(authority);
var credential = new ClientCredential(appId, appSecret);
var authResult = await authContext.AcquireTokenAsync(resource, credential);
return authResult.AccessToken;
};
var client = new KeyVaultClient(callback);
var result = client.GetKeyAsync(_vaultBaseUrl, _keyId).Result;
var key = result.Key;
return key.ToRSA();
}
我从我的 Azure Key Vault 中获得了 RSA,并设法加密了我的字符串。问题是当我尝试解密该值时。在那个过程中,我得到了那个错误:
System.Security.Cryptography.CryptographicException: 'Error decoding OAEP padding.'
我认为这可能会发生,因为我没有 RSA 中的私钥,但我尝试使用这种方法来获取带有私钥的 RSA::
key.ToRSA(true);
但是得到了那个错误:
所以,我不知道如何完成这个过程。还有其他方法吗?或者怎么了?
解决方案
如果要使用 Azure Key Vault 加密和解密文本,可以使用 SDKAzure.Security.KeyVault.Keys
来实现。
例如
- 安装 SDK
Install-Package Azure.Security.KeyVault.Keys -Version 4.0.3
Install-Package Azure.Identity -Version 1.1.1
- 代码
ClientSecretCredential clientSecretCredential = new ClientSecretCredential(tenantId, // your tenant id
clientId, // your AD application appId
clientSecret // your AD application app secret
);
//get key
var KeyVaultName = "<your kay vault name>";
KeyClient keyClient = new KeyClient(new Uri($"https://{KeyVaultName}.vault.azure.net/"), clientSecretCredential);;
var keyName="<your key name>"
var key = await keyClient.GetKeyAsync(keyName);
// create CryptographyClient
CryptographyClient cryptoClient = new CryptographyClient(key.Value.Id, clientSecretCredential);
var str ="test"
Console.WriteLine("The String used to be encrypted is : " +str );
Console.WriteLine("-------------encrypt---------------");
var byteData = Encoding.Unicode.GetBytes(str);
var encryptResult = await cryptoClient.EncryptAsync(EncryptionAlgorithm.RsaOaep, byteData);
var encodedText = Convert.ToBase64String(encryptResult.Ciphertext);
Console.WriteLine(encodedText);
Console.WriteLine("-------------dencrypt---------------");
var encryptedBytes = Convert.FromBase64String(encodedText);
var dencryptResult = await cryptoClient.DecryptAsync(EncryptionAlgorithm.RsaOaep, encryptedBytes);
var decryptedText = Encoding.Unicode.GetString(dencryptResult.Plaintext);
Console.WriteLine(decryptedText);
推荐阅读
- visual-studio-code - 在 VSCode 中为 typescript 和 javascript 使用不同的 .eslintrc 配置文件?
- python - 正则表达式不删除标签之间的数据
- javascript - 如何在 Postman 中使用请求标头之一中的值设置全局变量?
- sql - 使用过程在数据库上创建多个更新。增量问题
- r - 是否有用于为单项选择题制作列联表的 R 函数?
- python - 在 Python 中从 HTML/Javascript 创建 PDF,不依赖操作系统
- xamarin - Xamarin.UITest 中的 WinHttpException
- javascript - 引用错误变量未在 Object forEach 上定义
- .net-core - 包“Microsoft.AspNet.WebApi.Core 5.2.7”已使用“.NETFFramework,Version=v4.6.1”恢复
- python - 如何为 Python 程序设置 key 和 value 的限制