我已经将Always encrypted
用于Azure上数据库上的数据库表列。我已经阅读了这篇文章 - https://learn.microsoft.com/en-us/azure/sql-database/sql-database-always-encrypted-azure-key-vault - 非常仔细地遵循它。我已经加密了列,并且成功完成了。我可以看到该列已加密。
当我尝试按照同一篇文章现在尝试查看来自应用程序的数据时,我收到错误,指出:
无法使用密钥存储提供程序解密列加密密钥: "AZURE_KEY_VAULT"。验证列加密密钥的属性 及其在数据库中的列主密钥。的最后 10 个字节 加密的列加密密钥是:"54-36-01-E0-5C-A1-82-80-B1-B4"。
这是代码中的错误,但是在我放下该错误之后,我得到:
访问被拒绝。在任何访问策略中都找不到呼叫者。访客: appid=afd26169-bbac-4a45-ad3c-2b4492d19c6e;oid=dabbc750-5601-442b-9809-3a17f74d5aa2;组数=0;iss=https://sts.windows.net/bd8eb048-c497-4576-80eb-99e763b83ffd/保险库:AWKeyVault2;位置=东图斯2
值得注意的是,当我使用 SSMS 并将连接字符串选项设置为Column Encryption Setting=Enabled
时,我可以在 SSMS 中看到解密的数据。
在大多数情况下,我认为这是一个权限问题,但我不知所措。我已向应用注册授予对 Azure 订阅的完全访问权限。我还为应用程序注册生成了一个"机密",并在应用程序中使用它。如果我可以看到来自 SSMS 的数据,我认为这意味着加密成功,因此它一定与应用程序无法访问 Azure 密钥保管库中的密钥这一事实有关。我错过了什么?
好的,所以想通了。这绝对是一个权限的事情。若要完全验证你是否具有正确的权限,请转到">密钥保管库"边栏选项卡:
- 从左侧的"密钥保管库资源"边栏选项卡中选择"访问策略 "
- 点击顶部的"添加新"链接/按钮 选择
- "主体"以选择正在使用的应用程序(即从中获取客户端 ID 的应用注册( 从"密钥权限">
- 下拉列表中,确保授予它"解密"、"签名"、"获取"、"解包密钥"权限
- 确保保存更改
这是最后一件事 - 你仍然必须确保应用注册具有订阅的正确权限。
也许派对有点晚了,但我最近发表了一篇关于这个话题的文章,它可能会有所帮助:https://www.codeproject.com/Articles/5355073/Full-Tutorial-on-using-Always-Encrypted-with-Azure
基本上,设置和编码混合在一起,允许你将始终加密与 Azure 密钥保管库一起使用,它不仅与 Azure 设置和权限相关。 需要在 Azure Active Directory 中注册 Web 应用,获取相应的应用程序 ID,然后为其创建新的机密,获取机密值 - 然后编写一些代码以使用这两个值向 AKV 进行身份验证。 但这也带有一点怀疑 - 请阅读文章。