2009-08-24 79 views
1

我使用symfony框架和Propel工作,並且我在徘徊什麼是加密數據庫的最簡單方法。我不是在談論密碼,而是所有的數據庫。我爲一個客戶端構建了一個小型Web應用程序,用於管理一些信息(用戶帳戶,密碼等),並且我不希望在有人訪問phpmyadmin的情況下顯示該應用程序。如何在symfony中加密數據庫

回答

1

那麼這可能有點幼稚,但如何在寫入數據庫之前在服務器[php我認爲]上進行簡單加密,然後在讀取時將其解密回來?它看起來像你的問題是你不想讓服務器管理員很容易閱讀你的數據。如果你使用Symfony,你可以在模型中做到這一點,以至於你的代碼不需要改變。


經過一番挖掘後,如果我感覺特別勇敢,我會這樣做。

在xxx/symfony/vendor/propel/util/BasePeer中編輯buildParams()。PHP的,像860,你會發現

$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => $crit->getValue()); 

變化

$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => your_encryption_method($crit->getValue())); 

(除非我錯過了一些東西)所有的symfony /推進寫入數據庫將最終結束了調用該函數,所以你寫的一切到db使用your_encryption_method()加密。

嘗試了這一點,如果它的工作原理,你就仍然感覺勇敢,修改XXX/symfony中/供應商的addHydrate()函數/推動發電機/班/推動/發動機/建設者/ OM/PHP5/PHP5BasicObjectBuilder.php(668行),以便當您撥打時,水合物()代碼驅動會爲您生成。symfony propel-build-modelsymfony-propel-build-all將自動解密數據庫中的所有內容。

應該現在看起來像

        case PropelTypes::DATE: 
         case PropelTypes::TIME: 
         case PropelTypes::TIMESTAMP: 
          $script .= " 
      \$this->$clo = \$rs->get$affix(\$startcol + $n, null); 
"; 
          break; 
         default: 
          $script .= " 
      \$this->$clo = \$rs->get$affix(\$startcol + $n); 
"; 

你想進行此更改,運行symfony的推進,構建模型後,將其修改的東西沿着

case PropelTypes::DATE: 
         case PropelTypes::TIME: 
         case PropelTypes::TIMESTAMP: 
          $script .= " 
      \$this->$clo = \$rs->get$affix(\$startcol + $n, null); 
"; 
          break; 

         default: 
          $script .= " 
      \$this->$clo = \my_decryption_function($rs->get$affix(\$startcol + $n)); 
"; 

行,讓我知道它是否有效:-)。祝你好運,你可能已經知道這一點,但在你修改它們之前做這些文件的備份......哦,既然你正在修改核心symfony,你的其他項目將有問題,除非你想讓他們全部寫加密數據到db

+0

weeeeel ....是的,那是我的問題。在symfony中最簡單的方法是什麼?如何使用symfony以propel方式在數據庫中解密信息:) – Daniel 2009-08-29 10:38:27

+0

Symfony是什麼版本? – sjobe 2009-08-29 16:52:04

+0

我在Symfony 1.0.20 – Daniel 2009-08-31 10:14:50

2

通常你會用MySQL的內置權限來處理這個問題。

有人可以使用phpMyAdmin的唯一方法是,如果它在服務器上安裝和配置 - 解決這個問題最簡單的方法就是簡單地卸載它,或者如果你不能這樣做使用SSL連接和強密碼。

要考慮的其他事情將鎖定服務器 - 首先,您可以確保MySQL只接受來自本地主機或本地網絡的連接。

至於實際問題 - 我知道沒有辦法以有效的方式加密整個數據庫。你當然可以對數據進行加密,但鑑於你需要將解密代碼放在服務器上,好處是沒有意義......如果有人訪問服務器,他們仍然可以訪問數據。最好的辦法是首先防止訪問。

+0

我在一個共享的主機上工作,所以我可以;卸載phpmyadmin和沒有ssl,我的擔心是,網絡主機公司可以訪問數據庫,並看看。即使代碼位於服務器上,加密密鑰可以是客戶用於登錄其帳戶的相同(或另一個)密碼。所以你知道算法,但不知道加密密鑰。 – Daniel 2009-08-24 06:27:03

+0

如果安全性是這樣一個問題,你不應該在共享主機上。 至少,確保主機信譽良好,並有可靠的安全策略。 不知道我在這一個上有更好的答案。 – 2009-08-24 06:40:47

0

這是一個3級的問題。你必須保護幾件事情:

  1. 輸入/輸出中的數據,因此它不能 被截獲。
  2. 管理員權限,使您的系統在工作時不能被錯誤的人員訪問 。
  3. 硬盤驅動器本身,所以如果有人直接訪問 計算機,他將不能訪問 即使通過提取硬件。

對於1,您可以使用SSL和HTTPS。

對於2,請遵循sysadmin的最佳實踐來設置密碼,權限和更新(serverfault.com是你的朋友)。這包括數據庫管理員。

對於3,您必須加密整個硬件。僅對數據庫使用加密將會導致服務器性能下降。無論如何,使用加密技術會使您的系統變慢,但是如果Web應用程序死鎖,則會在文件系統之上的某個級別上執行加密。此外,用於在加密硬盤上運行整個Linux系統的工具相當成熟(在Ubuntu上,LVM可讓您幾乎透明地實現這一點)。

正如您所注意到的,這與Symfony無關,這是如此。