保护数据库行免受手工修改

本文关键字:修改 数据库 保护 | 更新日期: 2023-09-27 18:02:40

我有一个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");
    }

这段代码可以检测数据库中的手动更新,但是对于大量的记录,验证方法花费的时间太长。还有其他保护数据库中的数据的方法吗?或者对该代码进行任何修改以提高执行速度?

Edit:另外,数据库管理员不应该能够修改数据库中的数据。

保护数据库行免受手工修改

我认为这应该使用ms-sql安全机制来实现,而不是通过您自己的设备。SHA-1可以被用户模仿,这样他们仍然可以绕过你的反向图灵测试(仅限机器访问)?除此之外,您还可以询问是否真的要在执行每个(长)查询之前/期间检查每一行。也许更新触发器检查一致性/身份验证更有效?

但是,在我看来,答案是:让人类用户成为数据阅读器,并保护机器用户的凭证。

这当然应该使用Security来完成,因为这就是它的作用。滚动你自己的安全层很少是一个好主意……正如你在评论中指出的那样,这远不如使用适当的安全措施安全,而且如果安全措施实施得当,会浪费大量的服务器资源。

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

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