对SQL Server数据库记录或插入/更新操作进行数字签名

时间:2013-12-17 09:14:07

标签: sql-server digital-signature

有没有办法以某种方式用特定用户的证书或AD凭证等以数字方式对数据库记录或特定字段的当前状态进行签名?我需要实现某种记录级别的批准,其中特定字段或字段或行的正确性和有效性由用户名/密码组合或某些证书签名。数据应始终在记录中可见,我所需要的只是能够告诉:谁和何时批准数据。我不需要阻止状态更改(锁定),只需要验证当前状态是否已签名。

2 个答案:

答案 0 :(得分:8)

您可以使用SIGNBYASYMKEY-function使用非对称密钥创建签名:

DECLARE @id = 2; -- The primary key of the row we need to sign
DECLARE @keyid = AsymKey_Id( 'KeyID_for_the_User' );
DECLARE @keypw = N'pGFD4bb925DGvbd2439587y'; 
                 -- Password the user entered to sign the values
DECLARE @clear_text_data nvarchar(max);
set @clear_text_data = function_that_returns_a_concatenation_of_the_columns(@id)

UPDATE table
SET signature = SignByAsymKey( @keyid, @clear_text_data, @keypw )   
WHERE id = @id;

答案 1 :(得分:7)

[披露:我为CoSign工作]

您想要一个标准的数字签名?你想要一个X.509 signature,“真实的东西吗?”

如果是这样的话:

  1. 以特定的,记录的和可重复的方式将数据字段序列化(展平)到缓冲区中。
  2. 使用签名库对缓冲区进行签名。
  3. 生成的数字签名应该是“分离的数字签名”。分离签名的推荐标准是.p7b file type - 没有数据的PKCS#7数字签名结构。
  4. 将分离的数字签名存储为dbms记录中的附加字段。
  5. 您还需要提供签名验证服务,以确保此人(或机器)自签名以来数据未被更改,并且签名者的身份是可信的:

    1. 使用与上述相同的算法,将数据序列化为缓冲区
    2. 调用签名库的验证方法
    3. 将结果呈现给用户。
    4. 如果要改进系统的审核功能,则应启用序列化数据和外部签名的下载。这将启用审核检查:使用第三方软件复制验证软件的效果。

      理想情况下,应轻松检查数据的序列化版本是否与明文数据匹配。例如,序列化为json,csv或xml utf-8格式而不是二进制格式。任何一组位都可以签名,但纯文本格式将更容易审核。

      如果您还希望签名库处理正确保护签名者私钥的所有安全问题,请查看CoSign SAPI APIs.

      请记住,将签名者的私钥存储在文件系统的文件中意味着整个应用程序提供签名证明。提供真实签名证明的唯一方法是使用安全签名创建设备(SSCD)。一种简单的方法是使用CoSign Central signing appliance或类似的。主要的替代方案是智能卡,在客户端/服务器/ Web浏览器环境中很难实现。