Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保护数据库行免受手动修改_C#_Sql_Sql Server_Digital Signature_X509certificate - Fatal编程技术网

C# 保护数据库行免受手动修改

C# 保护数据库行免受手动修改,c#,sql,sql-server,digital-signature,x509certificate,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; X509Certif

我有一个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");
    }
此代码可以检测数据库中的手动更新,但对于大量记录,验证方法花费的时间太长。还有其他保护数据库中数据的方法吗?或者对该代码进行任何修改以更快地执行


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

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


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

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


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

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

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


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

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


标记您正在使用的dbms产品。您是否可以删除除使用该产品的帐户之外的所有用户的DML权限software@TheGameiswar:我正在搜索软件解决方案。请标记您正在使用的dbms产品。除了使用的帐户之外,是否可以删除所有用户的DML权限software@TheGameiswar:我正在搜索软件解决方案。