VERIFYSIGNEDBYCERT (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

测试经过数字签名的数据在签名后是否发生了更改。

Transact-SQL 语法约定

语法

VerifySignedByCert( Cert_ID , signed_data , signature )  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

Cert_ID
数据库中证书的 ID。 Cert_ID 的数据类型为 int

signed_data
类型为 nvarchar、char、varchar 或 nchar 的变量,上述类型包含已使用证书进行签名的数据

签名
附加到已签名数据中的签名。 signature 的数据类型为 varbinary

返回类型

int

如果已签名的数据未更改,则返回 1;否则返回 0。

注解

VerifySignedBycert 使用指定证书的公钥对数据的签名进行解密,并将解密所得到的值与数据新计算出的 MD5 哈希值进行比较。 如果值匹配,则确认签名有效。

权限

需要对证书拥有 VIEW DEFINITION 权限。

示例

A. 验证已签名的数据尚未被篡改

以下示例测试 Signed_Data 中的信息是否自使用名为 Shipping04 的证书对其进行签名之后发生了更改。 签名存储在 DataSignature 中。 证书 Shipping04 将传递给 Cert_ID,后者则返回数据库中证书的 ID。 如果 VerifySignedByCert 返回 1,则表示签名正确。 如果 VerifySignedByCert 返回 0,则 Signed_Data 中的数据不是用于生成 DataSignature 的数据。 在这种情况下,要么 Signed_Data 自签名以来发生了更改,要么 Signed_Data 使用不同的证书进行了签名。

SELECT Data, VerifySignedByCert( Cert_Id( 'Shipping04' ),  
    Signed_Data, DataSignature ) AS IsSignatureValid  
FROM [AdventureWorks2022].[SignedData04]   
WHERE Description = N'data signed by certificate ''Shipping04''';  
GO  

B. 仅返回包含有效签名的记录

此查询仅返回自使用证书 Shipping04 签名以来尚未更改的记录。

SELECT Data FROM [AdventureWorks2022].[SignedData04]   
WHERE VerifySignedByCert( Cert_Id( 'Shipping04' ), Data,   
    DataSignature ) = 1   
AND Description = N'data signed by certificate ''Shipping04''';  
GO  

另请参阅

CERT_ID (Transact-SQL)
SIGNBYCERT (Transact-SQL)
CREATE CERTIFICATE (Transact-SQL)
ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
加密层次结构