2016-08-17 54 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

恕我直言,這應該使用ms-sql安全機制而不是通過自己的設計來實現。用戶可以模擬SHA-1,這樣他們仍然可以繞過反向圖靈測試(僅限機器訪問)? 接下來,您可以詢問您是否真的要在執行每個(長)查詢之前/之前檢查每行。也許更新觸發器檢查一致性/認證更有效?

但我認爲答案是:使用戶用戶數據收集器和保護機器用戶的憑證。

1

這當然應該使用安全,因爲它就是這樣。滾動您自己的安全層很少是一個好主意......正如您在評論中指出的那樣,這比使用適當的安全性要安全得多,並且如果安全性得到正確實施,會浪費大量的服務器資源,從而造成冗餘。

您可以生成隨機強密碼並在應用程序中對其進行加密,然後將其作爲唯一具有對數據庫的寫入訪問權限的帳戶。這是最安全的方法,因爲它已經內置到數據庫中,所以它遠遠少於開銷性能。

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