2012-09-28 80 views
2

目前我正在開發連接到MySQL數據庫以檢索和存儲數據的軟件。該軟件本身正在運行,但我想實現一些新的安全功能。如何使用哈希密碼連接到MySQL數據庫

其中一個安全功能是將數據庫用戶的密碼存儲爲散列而不是純文本。 爲了記錄,我不使用表來驗證用戶,我正在談論數據庫用戶連接到數據庫本身。

我目前使用爲明文傳送口令MySQL數據庫連接字符串:

public abstract Database() 
    { 
     ReadConfig(); 
     connectionstring = "SERVER=" + server + ";" + 
       "DATABASE=" + database + ";" + 
       "UID=" + username + ";" + 
       "PASSWORD=" + password + ";"; 
     try 
     { 
      connection = new MySqlConnection(connectionstring); 
     } 
     catch (MySqlException ex) 
     { 
      LogService.Log("ERROR - " + ex.ToString()); 
     } 
    } 

我也是這個數據存儲在用戶的計算機上,因此用戶可以更改服務器地址,數據庫,用戶名和密碼。正如我所說,這是以純文本形式存儲的。以純文本格式存儲的服務器地址,數據庫名稱和用戶名都可以,但我不想以純文本形式存儲密碼。

生成SHA1哈希(或其他哈希方法)不是問題,因爲我已經有一個方法來生成這些哈希。

總之,我想將密碼保存爲散列,並在連接字符串中使用該散列。我怎樣才能實現這個?

編輯: 我知道這是一個'通過默默無聞的安全'解決方案,它不是擴展我的軟件安全的最佳方式。我正在研究如何使用質詢 - 響應方法,但同時我想實施上述。

+0

你使用什麼散列方法? –

+1

如果你能夠實現這一點,它不會爲你提供任何好處,因爲攻擊者可能只是嗅探你發送的散列密碼並在以後重播。爲了有效,您的數據庫必須支持挑戰 - 響應類型的身份驗證,您在該數據庫中以x用戶身份通知數據庫,數據庫向您發送挑戰,並且您的響應基於該挑戰+密碼 - 我不認爲MySQL支持這一點。 – mah

+0

@CuongLe我目前不使用任何散列這個密碼,但我有一個方法來產生一個字符串的SHA1散列。 – Stefan

回答

1

您可以在這裏做的最好的方式是加密用戶的登錄信息並在您想要登錄時使用明文。 MySQL不會採用散列值 - 如果是這樣,這不會比使用原始(非哈希)值更安全。

'共享祕密'的挑戰是使用服務器上的代理來控制登錄。當客戶想連接時,服務器代理會發送一串長的隨機位。客戶端將追加(共享)'祕密文本'到這個結尾,使用你的SHA-1散列並將其發送回服務器。服務器會對文本執行相同的操作並比較字符串。這樣每次都會有不同的密碼,嗅探它並不重要。

一旦客戶端通過驗證,服務器代理將啓用與mysql進程的通信。使用libmysql(或其c#)等價物,您可以複製在'常規'mysql客戶端上發生的任何事情。

+0

我知道這不會解決安全問題,我只是試圖將密碼保存在用戶計算機上作爲散列,然後將該散列發送到數據庫。 無論如何,我必須弄清楚如何實施挑戰 - 響應機制。感謝您的信息! – Stefan