2014-10-20 26 views
1

我有一個關於在數據庫中驗證散列文本的問題。現在,已經在數據庫中註冊的UserType被哈希,如下圖所示:刪除在數據庫中散列存儲的組合框項目c#

我希望當存在管理員文本作爲散列存儲在數據庫中時,程序將驗證散列並檢查if驗證是管理員文本。如果是,那麼它只會刪除組合框列表中的管理員文本。

爲什麼我通過Hash將UserType存儲到數據庫的原因是我限制其他UserType以獲得對系統的完全訪問權限並防止黑客將UserType更改爲管理員以外的其他用戶(如果我存儲它只有純文本)在數據庫中找到之後。

enter image description here

以上所述的圖像顯示,用戶類型已被散列,並且被散列的文本是用於用戶類型管理員。

現在,我喜歡這個添加和存儲散列用戶類型的數據庫:

public static void AddDatabase(string _selectedIndex) 
     { 
      using (OleDbConnection connection = new OleDbConnection(connectionString)) 
      { 
       string query = "INSERT INTO [Member] ([UserType]) VALUES (@UserType)"; 

       connection.Open(); 

       _hashedType = BCrypt.CreateHash(_selectedIndex, BCrypt.GenerateSalt(12)); 

       using (OleDbCommand command = new OleDbCommand(query, connection)) 
       { 
        command.Parameters.Add("@UserType", OleDbType.VarChar); 
        command.Parameters["@UserType"].Value = _hashedType; 
        command.ExecuteNonQuery(); 
       } 

       connection.Close(); 
      } 
     } 

void button2_Click(object sender, EventArgs e) 
     { 
    SystemManager.AddDatabase(this.comboBox1.Text); 
     } 

void Registration_Load(object sender, EventArgs e) 
     { 
      if (SystemManager.CheckType("Administrator") != true) 
      { 
       this.comboBox1.Items.Add("Administrator"); 
      } 

      this.comboBox1.Items.Add("Member"); 

      this.comboBox1.SelectedIndex = 0; 
     } 

爲了驗證它,我使用它就像下面的代碼。但是,當我運行程序,一切都成了空(組合框下拉列表不顯示任何東西(空文本)像圖像下方):

public static bool CheckType(string _value1) 
     { 
      using (OleDbConnection connection = new OleDbConnection(SystemManager.connectionString)) 
      { 
       string query = "SELECT COUNT(*) FROM [Member] WHERE [UserType] = @UserType"; 

       connection.Open(); 

       using (OleDbCommand command = new OleDbCommand(query, connection)) 
       { 
        command.Parameters.Add("@UserType", OleDbType.VarChar); 
        command.Parameters["@UserType"].Value = BCrypt.ValidateHash(_value1, _hashedType); 

        _count = (int)command.ExecuteScalar(); 

        connection.Close(); 
       } 

      } 

      return _count > 0; 
     } 

enter image description here

非常感謝您!

我真的很感激你的答案

回答

1

兩件事情:

首先,因爲你展示的代碼包含字符串「會員」,以您的組合框的無條件的添加,那麼可以肯定,要麼方法不被調用,或者稍後某些代碼正在清除ComboBox。您沒有向其他人發佈足夠完整的樣本以瞭解哪個是正確答案,因此您必須自己調試。首先在方法上放置一個斷點,以確定它是否被調用。

其次,我質疑這個使用散列值的整體策略,以確保有人改變價值。如果他們有權訪問數據庫並可以修改其元素,則他們擁有他們所需的一切。散列敏感信息僅在您可以假設存儲的散列本身不能被修改並且您想要其他人提供只有他們知道的某些數據(例如密碼)時纔有用,以便您可以散列該數據並對其進行比較到存儲的散列。當然這隻有在使用安全散列時纔有效。如果我是攻擊者,並且我有權訪問數據庫,並且我想要將某個用戶的類型更改爲不同的內容,那麼我需要做的就是複製我在其他某個用戶中找到的值我想將其更改爲相同類型。在這裏你可以用salt,但即使這樣做也沒有幫助,如果攻擊者知道使用的鹽和散列算法(這裏提供的兩條信息);我可以隨意從頭開始生成散列。

如果您希望數據庫的安全性不受變化影響,您需要不讓攻擊者首先更改它。

+0

感謝您的解釋,先生,非常有幫助。那麼,一旦程序安裝在用戶的計算機上,我應該只鎖定包含數據庫的文件夾嗎?那麼,任何人都無法通過Windows資源管理器訪問該文件夾,但是如果我鎖定該文件夾,任何人仍然可以訪問數據庫權利先生(僅從程序本身)?出現組合框中的項目並且程序在這一行中工作:'command.Parameters [「@ UserType」]。Value = BCrypt.ValidateHash(_value1,_hashedType);'變成這樣:'command.Parameters [「@ UserType 「] .Value = _value1;' – 2014-10-21 02:09:35

+0

一般來說:你放在用戶電腦上的任何東西都是不安全的。他們擁有電腦。他們最終(通過不同程度的努力)可以完全訪問該計算機上的任何內容。對於_any_安全相關的問題,這不僅僅是你的數據庫。如果你試圖「鎖定該文件夾」(你的意思是在目錄上設置一些安全設置?),管理員用戶仍然可以繞過該目錄。即使您在所有內容中都放置了三十層加密層,您在該PC上本地運行的程序也會提供模板,以顯示如何最終訪問PC上的_everything_。 – 2014-10-21 02:40:01

+0

我的意思是(鎖定文件夾)將密碼放到包含數據庫的文件夾內,因此無法由任何用戶打開(當他們想要通過資源管理器打開該文件夾時,例如數據庫安裝在D:/安裝程序/數據庫/ db1.accdb「,他們查找那個URL並想打開數據庫文件夾,如果他們不知道密碼,他們不能這樣做,但是一旦他們啓動了程序,程序就可以訪問數據庫,但數據庫文件夾仍然被鎖定在這種情況下,用戶不能修改用戶類型,因爲他們的用戶類型限制 – 2014-10-21 06:18:04