如何在SQL Server中创建非对称加密视图_结合证书与签名技术

风婷君_1164

风婷君_1164

2026-05-11

596人浏览

原创

sql server不支持直接创建“加密视图”,需通过证书签名函数+视图调用实现:先建rsa_2048非对称密钥或证书,再创建with schemabinding的解密函数并用证书签名,最后视图调用该函数;须映射证书用户并授execute权限,且重视证书备份与生命周期管理。

如何在sql server中创建非对称加密视图_结合证书与签名技术

CREATE ASYMMETRIC KEY 本身不能直接用于创建“加密视图”,SQL Server 也不支持在 VIEW 定义中内联调用 ENCRYPTBYASYMKEY 或自动加密列值。所谓“非对称加密视图”,实际是视图 + 证书/非对称密钥签名 + 底层加密列的组合方案,核心目标通常是:控制谁能看到原始数据、防止篡改、或满足审计场景下的可信计算路径。

下面分三个关键实操环节说明怎么做、为什么、以及容易掉坑的地方。

创建非对称密钥时必须显式指定 ALGORITHM 和 ENCRYPTION BY

SQL Server 不允许省略算法或加密机制——哪怕你后续只打算用公钥加密。不写 ALGORITHM 会报错 Msg 156, Level 15, State 1, Line X: Incorrect syntax near the keyword 'ENCRYPTION';不写 ENCRYPTION BY PASSWORD 则私钥无法受保护,导致 sys.asymmetric_keys.pvt_key_encryption_type_desc 显示为 NO_ENCRYPTION,这在生产环境等于裸奔。

正确写法示例:

CREATE ASYMMETRIC KEY MyAsymKey 
WITH ALGORITHM = RSA_2048 
ENCRYPTION BY PASSWORD = 'StrongP@ssw0rd!2026';
  • RSA_2048 是最低安全基线,RSA_512 已被弃用,Azure SQL 托管实例拒绝创建
  • 密码不能是空字符串,也不能只含空格;若用 ENCRYPTION BY MASTER KEY,需先确保存在数据库主密钥(CREATE MASTER KEY)
  • 密钥名必须符合标识符规则,且不能与现有证书、对称密钥重名

用证书替代非对称密钥更适配视图场景

虽然语法上都能做加密,但证书天然带有效期、主题、颁发者等元数据,更适合绑定到模块(如函数、存储过程)签名——而这是构建“可信视图”的关键一步。视图本身不可签名,但你可以把解密逻辑封装进带签名的标量函数,再在视图里调用它。

典型链路是:CERTIFICATE → SIGNATURE on FUNCTION → VIEW calls that function。

  • 证书必须用 ENCRYPTION BY PASSWORD 创建,否则无法用于签名(ADD SIGNATURE 会报错 Msg 15197)
  • 签名后的函数,即使调用者没有 VIEW DEFINITION 权限,也能执行——权限由证书控制,不是函数所有者
  • 证书备份比非对称密钥更重要:还原时若缺失证书,签名失效,函数将拒绝执行(报错 Msg 15468)

视图里不能直接调用 ENCRYPTBYASYMKEY,但可以安全调用解密函数

SQL Server 禁止在视图定义中使用任何加密/解密函数(ENCRYPTBYASYMKEY、DECRYPTBYASYMKEY、ENCRYPTBYCERT 等),因为它们属于“副作用函数”,违反视图的确定性要求。但你可以绕过限制:把解密逻辑写成带签名的内联表值函数(ITVF)或标量函数,再在视图中 SELECT 它。

例如,定义一个解密手机号的函数:

CREATE FUNCTION dbo.fn_DecryptPhone(@encrypted varbinary(8000))
RETURNS nvarchar(20)
WITH SCHEMABINDING
AS
BEGIN
  RETURN CAST(DECRYPTBYASYMKEY(ASYMKEY_ID('MyAsymKey'), @encrypted, N'StrongP@ssw0rd!2026') AS nvarchar(20));
END;
  • 必须加 WITH SCHEMABINDING,否则无法被签名
  • 函数体内硬编码密码是常见做法,但需确保该密码与创建密钥时一致;若改用证书,则换成 DECRYPTBYCERT(CERT_ID('MyCert'), ...)
  • 调用该函数的视图,用户只需对视图有 SELECT 权限,无需对密钥或证书有 VIEW DEFINITION ——前提是函数已用证书签名

签名函数后,必须把证书用户映射到调用上下文

即使函数已签名,执行时仍可能报 Msg 15313: The certificate used for signing is not trusted。根本原因是:SQL Server 在执行签名模块时,会检查调用者的登录名是否映射到该证书对应的数据库用户,且该用户需有 UNSAFE ASSEMBLY 或至少 EXECUTE 权限。

  • 执行 CREATE USER CertUser FROM CERTIFICATE MyCert 创建证书映射用户
  • 给该用户授予 EXECUTE 权限:GRANT EXECUTE ON dbo.fn_DecryptPhone TO CertUser
  • 如果函数需要访问其他表,还需额外授权(如 SELECT 表权限),但这些权限不能通过证书继承,必须显式赋予
  • Azure SQL 数据库不支持证书映射用户,此时只能退回到用数据库角色 + 密钥权限控制,安全性略弱

真正麻烦的不是语法,而是密钥生命周期管理:证书过期、密码轮换、密钥迁移时,所有依赖它的函数和视图都会静默失败。别只盯着 CREATE 语句,导出/导入证书、备份密钥密码、验证签名有效性(SELECT * FROM sys.crypt_properties)这些操作,才是线上稳定运行的关键。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5391

4

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2645

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3881

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2911

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

947

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2567

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2567

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2853

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2381

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习