保护数据库行不受手动修改

时间:2016-08-17 09:45:41

标签: c# sql sql-server digital-signature x509certificate

我有一个C#应用程序,它将数据库事务执行到SQL数据库中。数据库应仅从软件更新,因此我尝试使用以下代码对软件中的行进行数字签名:

  private static byte[] SignData(SignedData data)
    {
        if (data == null) throw new ArgumentNullException("data");
        RSACryptoServiceProvider csp = null;
        X509Certificate2 cert = data.Certificate;
        csp = (RSACryptoServiceProvider)cert.PrivateKey;
        if (csp == null)
        {
            return null;
        }
        byte[] hash;
        using (var sha1 = new SHA1Managed())
        {
            var vv = data.Data.ToList();
            vv.Sort();
            hash = sha1.ComputeHash(vv.ToArray());
        }
        return csp.SignHash(hash, null);
    }

为了验证数字签名,我使用以下内容:

static bool VerifyData(VerifiedData data)
    {
        if (data == null) throw new ArgumentNullException("data");
        if (data.Certificate != null)
        {
            X509Certificate2 cert = data.Certificate;
            //var csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
            var csp = (RSACryptoServiceProvider)cert.PrivateKey;
            byte[] hash;

            using (var sha1 = new SHA1Managed())
            {
                var vv = data.Data.ToList();
                vv.Sort();
                hash = sha1.ComputeHash(vv.ToArray());
            }
            return csp.VerifyHash(hash, null, data.Signature.ToArray());

        }
        throw new ArgumentNullException("Certificate");
    }

此代码可以检测数据库中的手动更新,但验证方法对于大量记录需要太长时间。还有其他保护数据库中数据的想法吗?或对此代码的任何修改以更快地执行?

编辑:此外,数据库管理员不应该能够修改数据库中的数据。

2 个答案:

答案 0 :(得分:3)

恕我直言,这应该使用ms-sql安全机制来实现,而不是通过自己设计。并且SHA-1可以被用户模仿,因此他们仍然可以绕过您的反向图灵测试(仅限机器访问)? 接下来,您可以询问是否确实要在执行每个(长)查询之前/之后检查每一行。也许更新触发器检查一致性/身份验证会更有效吗?

但我认为答案是:让人类用户使用数据加载器并保护机器用户的凭据。

答案 1 :(得分:1)

这当然应该使用安全性来完成,因为它就是这样。滚动你自己的安全层很少是一个好主意......正如你的评论中所指出的那样,这远远不如使用适当的安全性那么安全,并且如果安全性得到正确实施,那么服务器资源的大量浪费就会造成冗余。

您可以生成随机强密码并在应用程序中对其进行加密,然后将其作为唯一对数据库具有写访问权限的帐户。这是最安全的方法,并且具有远远低于开销性能的优点,因为它已经内置到数据库中。

https://msdn.microsoft.com/en-GB/library/ms189121.aspx