VerifySignedByCert (Transact-SQL)

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

主题链接图标Transact-SQL 语法约定

语法

VerifySignedByCert( Cert_ID , signed_data , signature )

参数

  • Cert_ID
    数据库中证书的 ID。 int
  • signed_data
    类型为 nvarcharcharvarcharnchar 的变量,上述类型包含已使用证书进行签名的数据。
  • signature
    附加到已签名数据中的签名。 varbinary.

返回类型

int

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

备注

VerifySignedByCert 使用存储在数据库中的证书从先前签名的数据派生签名。在检索数据时,VerifySignedByCert 会将新派生的签名与附加到已签名数据中的签名进行比较。如果新派生的签名与附加到已签名数据中的签名相同,则证明该数据在签名之后未发生更改。签名计算将基于正在验证的模块中的所有字符,包括前置空格、尾随空格、回车符和换行符。

权限

需要对证书拥有 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 [AdventureWorks].[SignedData04] 
WHERE Description = N'data signed by certificate ''Shipping04''';
GO

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

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

SELECT Data FROM [AdventureWorks].[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)

其他资源

加密层次结构

帮助和信息

获取 SQL Server 2005 帮助