保护数据库行免受手工修改
本文关键字:修改 数据库 保护 | 更新日期: 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