2011-05-27 73 views
4

我們在服務器模式下使用Java + H2數據庫,因爲我們不希望用戶訪問數據庫文件。H2數據庫:如何使用加密進行保護,而無需公開文件加密密鑰

爲了給數據庫文件增加更多保護,我們計劃在存儲被盜的情況下使用AES加密(將CIPHER = AES添加到數據庫URL)。

但是,連接時([文件密碼] [空格] [用戶密碼]),每個用戶還需要提供文件保護密碼。

雖然用戶無法訪問數據庫文件,但知道加密密鑰(文件保護密碼)會使加密無用。

任何想法保持數據庫文件的安全(加密),而不暴露文件加密密鑰給用戶?

謝謝。

+0

這是如何具體到H2? – trashgod 2011-05-27 06:16:42

回答

4

在H2內目前沒有辦法做到這一點。

一種解決方案是使用獨立於H2的文件系統加密。

但是請注意,在某些時候,您將不得不提供(數據庫文件或文件系統)密碼。這可能是啓動服務器時(提示手動輸入密碼)。不幸的是,由於有人不得不輸入密碼,因此無法完全自動啓動服務器。

+0

用戶可能會竊取數據庫存儲設備。 – Andy 2011-05-27 07:40:26

+0

我明白了。不幸的是,H2目前沒有功能來做你想做的事情。我將添加一個功能請求。 – 2011-05-27 07:44:35

+0

非常感謝Thomas。可能會脫離主題,但是您是否知道另一種解決方法或其他數據庫系統?或者它是由許多數據庫系統共享的常見問題? – Andy 2011-05-27 08:07:05

1

我聽說過的一個聰明的方法是編寫一個簡單的web服務來阻止所有的站點,但是你的webapp的服務器。將SSL用於基於證書的身份驗證。

此webservice提供加密密鑰。

這聽起來很愚蠢,因爲它似乎提供沒有身份驗證的密鑰,但基於證書的身份驗證涵蓋了這一點。它在傳輸過程中提供了密鑰的加密(如果你真的偏執,你可以使用共享密鑰來包裝數據庫密鑰)。它只能從webapp的服務器調用,並且觸發webservice調用比執行SQL注入甚至查看文件系統要困難得多。

如果您的風險模型允許,您甚至可以在與您的web應用程序相同的框中運行此webservice。

0

第二種方法(如果您擁有必要的權限)是創建一個虛擬磁盤。將密鑰放在虛擬磁盤上。

在啓動過程中,您將掛載虛擬磁盤,讀取加密密鑰,然後卸載虛擬磁盤。在某些設計中,您可以放棄允許您掛載虛擬磁盤的操作系統權限 - 然後攻擊者通過web應用程序讀取密鑰實際上是不可能的。

這來自一個更舊的策略,它從CD-ROM(甚至是軟盤)讀取敏感信息。該應用程序將讀取密鑰,然後彈出媒體。它可以工作,但需要人工干預才能在下次重新啓動之前重新加載介質。它也不適用於服務器沒有CD-ROM的現代環境,更不用說軟盤驅動器。