C# 保护数据库行免受手动修改
我有一个C#应用程序,它在SQL数据库中执行数据库事务。数据库应仅从软件更新,因此我尝试使用以下代码对软件中的行进行数字签名: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
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:我正在搜索软件解决方案。