2010-07-03 154 views
4

我剛剛意識到在我的可執行文件中沒有最好的方法來隱藏MySQL字符串連接密碼,尤其是在JAR文件中。即使在EXE中對它進行加密也只會減慢進程速度(儘管我不確定從EXE文件獲得加密密碼需要多長時間)。創建數據庫桌面應用程序的正確方法是什麼?

所以,從我的理解,我需要在中間的東西,將添加,編輯,刪除等數據庫。看起來像REST API或SOAP服務的工作。

我的問題是,我應該使用哪一個?還是應該使用別的東西?我正在考慮Zend Framework來創建這些REST API。然後,我會使用Qt創建一個桌面應用程序來調用這些API。但是如果我繼續使用REST,我的應用程序將是一個3層應用程序。如果我只是創建一個Web應用程序,會不會更好?也許我應該堅持桌面應用程序調用這些API,因爲應用程序已經完成了,我只需要從直接連接到MySQL變成調用這些API來執行任務,而不是將整個應用程序更改爲網絡。

任何建議將是非常有益的。提前致謝。

UPDATE:

我正在尋找一個安全將保護我的MySQL密碼連接。

混淆器只會混淆代碼,它不會隱藏我的字符串數據庫信息。在我看來,使用工具(如JAD)反編譯JAR後,可以使用grep輕鬆找到它。

關於我的應用程序:

  1. 使用集中MySQL數據庫
  2. 成千上萬的用戶
  3. 包含敏感信息
  4. 我的客戶使用Linux和Windows
  5. 我的服務器使用Linux
  6. 所有訪問都在局域網中完成,沒有外部連接(來自Internet等)

我目前的解決方案(意見請):

  1. 使用REST的API(更安全,因爲MySQL的密碼是在服務器)
  2. 使用Qt使用加密的密碼
+1

讓REST API在沒有任何身份驗證的情況下被調用並不比「嵌入」密碼更安全。 – 2010-07-03 10:27:39

+0

如果REST API不是一個好的解決方案,我會考慮一些授權,那麼,你有什麼建議? – amree 2010-07-03 10:55:52

回答

3

這取決於你在尋找什麼樣的安全性。這是爲了保護用戶的應用程序嗎?爲了保護其他用戶的用戶數據?爲了保護多個用戶的數據彼此?爲了保護用戶的數據免受攻擊?

在很多應用程序中,以純文本格式存儲數據庫登錄憑據沒有任何問題。在其他情況下,您可以嘗試:

  1. 使用相當強的算法(例如,加密)來加密用戶選擇的數據庫密碼。河豚,使用硬編碼的鑰匙;
  2. 讓用戶每次提供密碼和「登錄」到程序中;
  3. 以純文本格式存儲數據庫密碼,但使用硬編碼密鑰加密數據;
  4. 與上面相同,但是使用他們自己提供的密碼加密每個用戶的數據;
  5. 與2相同,但將每個用戶的數據存儲在他們自己的數據庫中,其登錄信息作爲數據庫憑證;
  6. 將數據存儲在安全遠程數據庫上,用戶必須登錄才能通過SOAP API訪問該數據;
  7. 使用本機文件系統權限來保護持有登錄憑證的配置文件;
  8. 與#1相同,但是可以自己製作精心製作的密鑰生成系統:例如使用隨機生成的salt通過MD5運行機器SID或硬件ID,然後使用結果來加密登錄憑證。

請記住,沒有完美的安全性這樣的事情,所以無論你解決什麼都不需要牢不可破。它只需要足夠強大就可以打破繞過安全機制的麻煩,超出數據的價值。因此,例如,如果數據是掃雷中最高分的列表,那麼ROT13可能就足夠了。

編輯:對Java,.NET和其他大多數流行的語言 我只想補充一點,即使你不能避開不必硬編碼在應用程序中的加密密鑰,有混淆器/構架。這些工具的主要用途之一是隱藏敏感的硬編碼字符串,如加密密鑰。

編輯2: 考慮到有關該應用程序的更多詳細信息,在這種情況下僅適用1,6和8。正如George正確指出的那樣,SOAP API更適合#6。

我也想提一下,加密字符串文字的Java資源混淆器。 This只是一個例子。

+0

我不同意以純文本格式存儲數據庫登錄憑據沒有任何問題。有人可以在未經我許可的情況下直接連接到服務器。 1)這不保護我的MySQL密碼。 2)同上(雖然我確實爲我的用戶強制登錄)。 3)正如我所提到的,這隻會減緩進程速度( 4)如果攻擊者獲得我的MySQL密碼,它可以刪除我的所有數據,這會使數據加密變得毫無意義。 5)我有成千上萬的用戶。 6)我在考慮這個。 7)我不認爲這種方法可以在Windows中實現。 8)與#1相同 – amree 2010-07-03 15:11:43

+0

我想我應該已經更清楚了,通過「用戶選擇的密碼」我的意思是讓用戶指定DB密碼。雖然在所有情況下都不合適,但在某些情況下,純文本登錄憑據是允許的,例如。當數據庫不包含關鍵/敏感數據時。 – 2010-07-03 15:39:07

+0

感謝您的澄清。但給一個用戶(在我的情況下,成千上萬)用戶選擇的數據庫密碼不會很有幫助。例如,用戶A必須有權讀取,更新和刪除某個表。如果用戶的數據庫密碼遭到破壞,攻擊者可以使用它連接到我的MySQL並逐一刪除該行。 – amree 2010-07-04 02:20:44

1

它非常依賴於你的應用程序運行什麼樣的環境

一)數據庫和客戶端本地
B)db和客戶端在本地網絡
C)db是在互聯網

我的兩個仙:

一)我想創建一個數據庫用戶,並不會使用一個密碼,但限制存取權限爲localhost
二)直接連接到數據庫是好的,但我想每個用戶必須先登錄與他自己的密碼並只授予他需要的權限。
c)允許mysql連接到公共服務器是一個壞主意。在這種情況下,web服務將是一個很好的解決方案。

無論如何,如果你的情況是b或c我會堅持用戶的登錄對話框。

也許你應該看看這個http://www.greensql.net/工具。 它就像一個防火牆,但對於MySQL/Postresql
所以你可以拒絕任何事情,只允許你想要的查詢。

+0

我的應用是在(b)類... 一)我不能因爲我的用戶是無處不在,他們需要能夠遠程訪問數據。 b)我不認爲MySQL可以限制用戶刪除哪些行以及哪些行可以讀取,除非以編程方式進行。 – amree 2010-07-03 15:12:01

+0

您可以通過使用觸發器和視圖來實現某種行級別的安全性。但是,如果您真的需要這種安全性,您應該考慮使用Web服務或構建Web應用程序。 – 2010-07-03 18:35:24

+0

正如你在另一篇文章中提到的,你擔心有人用密碼刪除所有數據。使用greensql(我提供的鏈接),您可以設置一個規則,阻止某人執行刪除命令,而不使用包含id列的where子句。這至少會阻止某人刪除多行。而且您完全可以控制哪些查詢是允許的。如果有人試圖執行一條聲明,則在它被阻止之前您沒有明確列入白名單。 – 2010-07-03 18:40:58

1

如果您使用Java來實現您的數據庫桌面應用程序,我建議使用Java DB作爲數據庫。有幾種方法可以保護它,並且在連接字符串中可以使用其他密碼。我建議閱讀Java DB Security - Security Features in Java DB Release 10.4

用Java DB部署應用程序非常簡單,因爲您可以將其中的大部分內容嵌入到同一個jar文件中。我在用Java實現的銷售點應用程序中使用了它。

+0

謝謝,這絕對是一個很好的閱讀。但是我已經放棄了Java桌面應用程序的希望,因爲它可以使用JAD等工具輕鬆進行反編譯。無論什麼東西都可以被攻擊者讀取。我不如使用Qt來開發我的應用程序,至少攻擊者需要更長的時間才能獲得我的MySQL密碼。 – amree 2010-07-04 02:07:38

相關問題