在BtoB应用程序中,我希望在Azure Blob存储中透明地加密数据。
但是,我们不能在keyvault中存储密钥:我们将生成一个对称密钥,并使用它来加密blob存储中的数据。然后,将使用客户的公钥对该对称密钥进行加密,并将其存储在某处。如果需要解密,客户将使用其私钥解密对称密钥。
我们发现的所有示例都使用keyvault来存储密钥。最相关的示例是https://learn.microsoft.com/en-us/azure/storage/blobs/client-side-encryption?tabs=dotnet#blob-service-encryption。
这位医生说:您的密钥和密钥解析程序示例,通过Azure Key Vault SDK或外部实现。但是没有文档解释如何进行“外部实现”,我尝试了以下代码来生成KeyEncryptionKey:
var symmetricSecurityKey = new SymmetricSecurityKey(_context.EncryptionKey);
var jsonWebKey = JsonWebKeyConverter.ConvertFromSymmetricSecurityKey(symmetricSecurityKey);
jsonWebKey.AdditionalData["iv"] = Convert.ToBase64String(_context.IV);
string jsonSerializedKey = JsonSerializer.Serialize(jsonWebKey);
Azure.Security.KeyVault.Keys.JsonWebKey keyvaultKey = (Azure.Security.KeyVault.Keys.JsonWebKey)JsonSerializer.Deserialize<Azure.Security.KeyVault.Keys.JsonWebKey>(jsonSerializedKey);
keyvaultKey.KeyType = KeyType.Rsa;
var cryptoClient = new CryptographyClient(keyvaultKey);
var keyResolver = new KeyResolver(new DefaultAzureCredential());
// We want the key to be passed from
ClientSideEncryptionOptions encryptionOptions = new ClientSideEncryptionOptions(ClientSideEncryptionVersion.V2_0)
{
KeyEncryptionKey = cryptoClient,
KeyResolver = keyResolver,
// String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
KeyWrapAlgorithm = "RSA-OAEP"
};
它会编译,但在执行时,对_rootContainer.UploadBlobAsync(fullPath,stream)的调用会引发以下错误:给定的键不支持操作WrapKey
显然,它试图加密或解密对称密钥。如果我不指定KeyWrapAlgorithm,它会返回:值不能为空。(参数'KeyWrapAlgorithm)
1条答案
按热度按时间m3eecexj1#
根据您的实际情况,不能100%确定它是否相关,但您确实写了“如果需要解密,客户将使用他的私钥解密对称密钥”,这似乎暗示它不是连续使用的数据。因此,这里有一个建议,并没有真正回答你的确切问题,但提出了一个替代路径,以实现相同的结果,少得多的代码为您编写!
我是AxCrypt的原作者,这是一个相当知名的文件加密应用程序。最近我发布了一个命令行工具箱,我认为它可以支持你的加密/解密场景。它使用与AxCrypt相同的核心加密代码,多年来已被证明,使用声音和良好的尝试算法和操作模式。它可以生成非对称密钥对(RSA-4096),按照您的描述安全地 Package 私钥,并使用公钥加密用于加密数据的对称密钥。它实际上不会使用Azure客户端加密库,但净效果几乎相同。Azure中的加密blob,可以使用私钥解密。
它是一个命令行实用程序,可以由脚本或C#/.NET代码调用,并具有广泛的功能集。你可以在github上找到它,在GNU GPL v3下授权的https://github.com/xecrets/xecrets-file-cli。尽管CLI Package 器是最近发布的,但底层加密技术已经生产了7年多,并且被广泛使用,因此可以认为它是稳定和可靠的。文档中有完整的示例,包括您的大部分场景。
当然,你也可以像CLI一样直接链接到底层库--但是你的代码将受到GPL要求的影响,你的代码也将成为GPL。如果您使用CLI,这不是问题,只有CLI是GPL:ed。
作为一个附带的好处,如果blob是作为文件下载的,它可以在命令行上使用Windows,macOS和Linux上的CLI手动解密,或者使用桌面应用程序(我们很快就会发布一个,现在正在测试中),甚至是现有的AxCrypt,如果他们确实需要自己解密,这对您的客户来说可能是一个好处。
如果出于某种原因,你真的需要使用Azure库,那么这个建议当然是不相关的。