如何使用Azure Key Vault检索的RSA公钥完成本地加密
问题
我计划按照以下流程使用已在Azure Key Vault中生成的RSA密钥:
- 检索RSA公钥
- 使用该公钥在本地对文本数据执行加密操作
- 在另一应用中调用Azure Key Vault完成密文解密
目前已完成的代码实现如下:
string clientId = "XYZ"; string tenantId = "ABC"; string clientSecret = "123"; string keyVaultName = "kvn"; string keyVaultKeyName = "kvkn"; string textToEncrypt = "StuffIDoNotWantYouToKnow"; ClientSecretCredential clientSecretCredential = new ClientSecretCredential( tenantId, // 租户ID clientId, // AD应用程序appId clientSecret // AD应用程序客户端密钥 ); // 获取密钥 KeyClient keyClient = new KeyClient(new Uri($"https://{keyVaultName}.vault.azure.net/"), clientSecretCredential); var key = keyClient.GetKey(keyVaultKeyName);
当前遇到的问题:不清楚如何使用已检索到的密钥完成文本数据的本地加密操作。
补充说明:当前使用的开发框架为.NET Framework 4.6.1
解答
Azure Key Vault的Key SDK自带公钥转换方法,不需要手动解析密钥参数,直接调用内置方法转成.NET原生RSA实例即可完成本地加密,具体实现如下:
- 先确保项目安装了兼容.NET Framework 4.6.1的
Azure.Security.KeyVault.Keys包,4.0.x~4.4.x版本均可兼容,不要选4.5以上放弃.NET Framework支持的版本。 - 注意
KeyClient.GetKey方法返回的是Response<KeyVaultKey>类型,需要取.Value属性才是实际的密钥对象。 - 加密填充算法必须和后续Key Vault解密支持的算法对齐,优先选
RSA-OAEP-256,这是Key Vault全版本支持的填充模式,安全性也优于PKCS#1 v1.5。
直接在你现有代码后面追加以下逻辑即可完成本地加密:
// 获取KeyVaultKey实例 KeyVaultKey vaultKey = key.Value; // 转换为本地RSA实例,该实例仅包含公钥,无法用于本地解密 using (RSA rsa = vaultKey.ToRSA()) { // 待加密文本转UTF8字节数组 byte[] plainData = Encoding.UTF8.GetBytes(textToEncrypt); // 执行本地加密,填充模式指定为OAEP SHA256 byte[] encryptedData = rsa.Encrypt(plainData, RSAEncryptionPadding.OaepSHA256); // 密文转Base64字符串,方便后续传输、存储 string encryptedBase64 = Convert.ToBase64String(encryptedData); }
几个关键注意点:
- 本地拿到的RSA实例仅包含公钥成分,私钥始终存储在Key Vault服务端,不会导出到本地,符合你设计的安全流程
- 后续调用Key Vault解密接口时,必须指定加密算法为
EncryptionAlgorithm.RsaOaep256,和本地加密填充模式完全一致,否则会触发解密失败 - RSA加密有长度限制:2048位密钥搭配OAEP256填充时,单次最多加密190字节明文;4096位密钥最多加密446字节明文。如果要加密更长的文本,不要拆分明文分段加密,采用混合加密方案:本地生成随机AES密钥用AES加密长文本,再用RSA公钥加密这个AES密钥,最终传输加密后的AES密钥+AES密文即可,解密时先调用Key Vault解开AES密钥,再本地用AES解明文。
内容的提问来源于stack exchange,提问作者Daniel Fridman
相关产品推荐
相关产品推荐

