如何在 SQL Server Always Encrypted 中为 CEK 生成 ENCRYPTED_VALUE

sgl*_*ski 6 sql-server encryption azure-sql-database azure-keyvault always-encrypted

是否可以通过与 SSMS 不同的方式生成 ENCRYPTED_VALUE?我喜欢为所选列启用“始终加密”功能,但我想知道如何通过未知密钥加密数据。

在我看来,总应该有一种方法可以在不连接到 azure key Vault 的情况下解密数据(就像我理解的 SQL Server 使用对称 AES256 加密数据一样)。

CREATE COLUMN ENCRYPTION KEY MyCEK   
WITH VALUES  
(  
    COLUMN_MASTER_KEY = MyCMK,   
    ALGORITHM = 'RSA_OAEP',   
    ENCRYPTED_VALUE = (i am talking about this value)
); 
Run Code Online (Sandbox Code Playgroud)

sgl*_*ski 4

在与谷歌进行搜索后,我发现了如何做到这一点。这是生成该值的示例代码(c#)。

        var provider = new SqlColumnEncryptionAzureKeyVaultProvider(GetTokenAsync);
        var randomBytes = new byte[32];

        using (var rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(randomBytes);
        }

        var base64 = Convert.ToBase64String(randomBytes);

        var encryptedKey = provider.EncryptColumnEncryptionKey(masterKeyPath, "RSA_OAEP", randomBytes);
        var encryptedKeySerialized = "0x" + BitConverter.ToString(encryptedKey).Replace("-", "");
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多信息,我建议您查看这篇文章: https: //blogs.msdn.microsoft.com/sqlsecurity/2015/09/25/creating-custom-key-store-providers-for-始终加密的azure-key-vault-示例/