/ / Защита на редовете на базата данни от ръчни модификации - c #, sql, sql-сървър, цифров подпис, x509сертификат

Защита на редове от бази от ръчни модификации - c #, sql, sql-сървър, цифров подпис, 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");
}

Този код може да открие ръчни актуализации вбаза данни, но методът за проверка отнема твърде много време за голям брой записи. Някакви други идеи за защита на данните в базата данни? или някакви промени в този код, за да се изпълняват по-бързо?

Редактиране: Също така администраторът на база данни не трябва да може да променя данните в базата данни.

Отговори:

3 за отговор № 1

IMHO това трябва да се реализира с помощта на ms-sqlмеханизъм за сигурност, а не чрез унищожаване на вашия собствен. И SHA-1 може ли да имитира потребители, така че те все още да могат да заобиколят вашия обратен тест на Тюринг (само за машинен достъп)? След това можете да попитате дали наистина искате да проверите всеки ред преди / докато всяка (дълга) заявка, която изпълнявате. Може би след това тригерът за актуализация на проверката на последователност / удостоверяване е по-ефективен?

Но отговорът, според мен, е: направете човешки потребители четци на данни и защитавайте идентификационните данни за потребителя на машината.


1 за отговор № 2

Това със сигурност трябва да стане с помощта Сигурност, тъй като това е за какво. Превъртането на вашия собствен слой за защита рядко е добра идея ... и както бе посочено във вашите коментари, това е много по-несигурно от използването на правилната сигурност и много голяма загуба на сървърни ресурси, правейки нещо, което е излишно, ако защитата се прилага правилно.

Можете да генерирате произволна силна парола икриптирайте го в приложението, след което имайте това като единствен акаунт с достъп за запис до базата данни. Това е най-сигурният метод и има далеч по-малко разумни резултати, тъй като вече е вграден в базата данни.

https://msdn.microsoft.com/en-GB/library/ms189121.aspx