2009-08-24 86 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无关,这是如此。