2016-08-17 4 views
1

У меня есть приложение 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); 
    } 

И verifiying цифровой подписи я использую следующее:

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

Этот код может обнаруживать обновления вручную в базе данных, но проверка метода занимает слишком много времени для большого количества записей. Любые другие идеи для защиты данных в базе данных? или какие-либо изменения этого кода для выполнения быстрее?

Редактировать: Кроме того, администратор базы данных не должен иметь возможность изменять данные в базе данных.

+0

Тег dbms-продукта, который вы используете. – jarlh

+0

Можете ли вы удалить разрешения DML для всех пользователей, кроме учетной записи, используя программное обеспечение – TheGameiswar

+0

@TheGameiswar: Я ищу программное решение. –

ответ

3

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

Но, на мой взгляд, ответ заключается в следующем: сделать учетные записи пользователей пользователей и защитить учетные данные для пользователя машины.

1

Это обязательно должно быть сделано с использованием Безопасность, так как она предназначена для. Роллинг вашего уровня безопасности редко является хорошей идеей ... и, как указано в ваших комментариях, это гораздо менее безопасно, чем использование надлежащей безопасности, и очень большая трата ресурсов сервера делает что-то лишнее, если безопасность реализована должным образом.

Вы можете создать случайный сильный пароль и зашифровать его в приложении, а затем использовать его как единственную учетную запись с доступом к записи в базу данных. Это самый безопасный метод и имеет гораздо более низкую производительность, так как он уже встроен в базу данных.

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

Смежные вопросы