SQL Server使用EKM提供的对称密钥调用EncryptByKey返回NULL的排查
问题描述
在SQL Server中使用外部密钥提供商(EKM)存储对称密钥,已成功在master库创建密钥:
USE master ; GO CREATE SYMMETRIC KEY symmetric_key FROM PROVIDER EKM_Prov WITH ALGORITHM = AES_256, PROVIDER_KEY_NAME = 'symmetric_key' ; GO
可在EKM提供商及sys.symmetric_keys表中查看到该密钥,但执行加密语句时始终返回NULL:
SELECT EncryptByKey(Key_GUID('symmetric_key'), 'Highest') AS CipherText;
已确认EKM托管的对称密钥无需执行OPEN SYMMETRIC KEY操作,询问遗漏的配置项,是否需要将密钥绑定到登录名及操作方法。
解决方案
以下是几个可能的原因及对应解决方法:
1. 数据库上下文不匹配
你在master库创建了对称密钥,但如果加密语句是在其他数据库上下文执行的,Key_GUID('symmetric_key')会无法找到密钥并返回NULL,进而导致EncryptByKey返回NULL。
解决方法:
- 切换到
master库执行加密语句:
USE master; GO SELECT EncryptByKey(Key_GUID('symmetric_key'), 'Highest') AS CipherText;
- 或者在
Key_GUID中指定密钥的完整数据库路径:
SELECT EncryptByKey(Key_GUID('master.symmetric_key'), 'Highest') AS CipherText;
2. 登录账号缺少密钥权限
默认情况下,只有密钥的创建者和sysadmin角色成员拥有该EKM对称密钥的访问权限。如果当前执行加密的登录账号没有足够权限,EncryptByKey会返回NULL。
解决方法:
给目标登录账号授予密钥的加密权限(或更高权限),执行以下语句(替换[YourLogin]为实际登录名):
USE master; GO -- 授予最小必要的加密权限 GRANT ENCRYPT ON SYMMETRIC KEY::symmetric_key TO [YourLogin]; -- 若需管理密钥,可授予完整控制权限 -- GRANT CONTROL ON SYMMETRIC KEY::symmetric_key TO [YourLogin];
3. EKM提供商端配置问题
即使SQL Server中已创建密钥条目,若EKM提供商未授权SQL Server的服务账号访问该密钥,也会导致加密失败返回NULL。
解决方法:
检查EKM提供商的配置:
- 确认SQL Server服务使用的账号(域账号或本地服务账号)在EKM系统中拥有该密钥的读取/加密权限;
- 验证EKM提供商与SQL Server的连接状态正常,密钥在EKM端处于可用状态。
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

