sql server 无原生“非对称加密视图”,实为证书签名解密函数+视图调用的组合方案,用于高敏字段权限隔离;create asymmetric key 必须指定 algorithm(如 rsa_2048)和 encryption by(如 password),否则报错。

CREATE ASYMMETRIC KEY 必须带 ALGORITHM 和 ENCRYPTION BY
直接执行 CREATE ASYMMETRIC KEY MyKey 会报错 Msg 156, Level 15, State 1,因为 SQL Server 强制要求显式声明算法和加密方式。
-
ALGORITHM = RSA_2048是当前最低安全基线;RSA_512已被弃用,Azure SQL 托管实例直接拒绝创建 -
ENCRYPTION BY PASSWORD不可省略——哪怕你后续打算用数据库主密钥(ENCRYPTION BY MASTER KEY),也得先确保CREATE MASTER KEY已存在,否则私钥裸露(pvt_key_encryption_type_desc = NO_ENCRYPTION) - 密码不能为空或纯空格;密钥名需符合标识符规则,且不能与现有证书、对称密钥重名
CERTIFICATE 比 ASYMMETRIC KEY 更适合绑定到函数签名
视图本身不可签名,但你可以把解密逻辑封装进标量函数,再用证书给函数加签名——这才是“可信路径”的关键。
- 证书自带有效期、主题等元数据,
ADD SIGNATURE要求证书必须用ENCRYPTION BY PASSWORD创建,否则报错Msg 15197 - 签名后的函数,调用者无需
VIEW DEFINITION权限,只要拥有证书映射用户的EXECUTE权限即可执行 - 证书必须备份(
BACKUP CERTIFICATE ... TO FILE),还原时若缺失,函数将拒绝运行并报Msg 15468
视图里不能调用 ENCRYPTBYASYMKEY,但能安全调用签名函数
你无法在 CREATE VIEW 语句里写 ENCRYPTBYASYMKEY(...),SQL Server 语法不允许;但可以放心调用已签名的解密函数,前提是该函数使用 WITH SCHEMABINDING 定义。
- 加密列(如
varbinary(256))应由应用层或存储过程调用ENCRYPTBYASYMKEY写入,视图只负责读取+解密 -
DECRYPTBYASYMKEY的第三个参数(私钥密码)在函数内硬编码或从安全上下文获取,避免暴露给调用者 - 注意性能:RSA_2048 单次最多解密 245 字节,超长字段(如大段备注)应改用对称密钥加密+非对称密钥保护该对称密钥
财务数据场景下最容易被忽略的三个点
不是“能不能做”,而是“做了但没生效”——常见于权限链断裂、证书生命周期失控、或误用加密函数。
- 忘记给证书映射用户授
EXECUTE权限,导致视图查询返回NULL而非报错,静默失败 - 证书过期后未更新,函数签名仍有效但解密失败(
DECRYPTBYASYMKEY返回NULL),财务报表数值异常却无日志提示 - 把
ENCRYPTBYASYMKEY直接塞进视图定义试图“实时加密”,结果语法报错或被 SQL Server 静默忽略











