我有一个 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/