c# - 保护数据库行免于手动修改

标签 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");
    }

此代码可以检测数据库中的手动更新,但验证方法对大量记录的验证时间太长。保护数据库中数据的任何其他想法?或对此代码进行任何修改以提高执行速度?

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

最佳答案

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

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

关于c# - 保护数据库行免于手动修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38993172/

相关文章:

c# - 处理 IConnectableObservable 不会发送 OnComplete

c# - 为什么 Json.NET 无法序列化 X509Certificate2?

mysql - 使用phpMyAdmin SQL查询的日期显示格式

sql - MSSQL - 选择表中最新出现的几行

c# - 在 .net 中存储 SQL 命令

c# - 查找值小于搜索值的最大 Dictionary<int,string> 键

php - MySQL 透视将行变成列

sql - 我应该在多对多 "link"表中使用索引列吗?

c# - 使用具有单个 DbContext 和 Entites 的多个数据库并在运行时生成 Conn String

sql-server - 在 SQL Server 中获取帐户 'locked' 状态