【发布时间】:2010-11-22 04:24:46
【问题描述】:
我使用 symfony 框架和 Propel,我一直在寻找加密数据库的最简单方法。我说的不是密码,而是所有的数据库。我为管理一些信息(用户帐户、密码等)的客户端构建了一个小型 Web 应用程序,我不希望它在有人有权访问 phpmyadmin 时可见。
【问题讨论】:
标签: php mysql encryption symfony1
我使用 symfony 框架和 Propel,我一直在寻找加密数据库的最简单方法。我说的不是密码,而是所有的数据库。我为管理一些信息(用户帐户、密码等)的客户端构建了一个小型 Web 应用程序,我不希望它在有人有权访问 phpmyadmin 时可见。
【问题讨论】:
标签: php mysql encryption symfony1
通常你会使用 MySQL 的内置权限来处理这个问题。
有人可以使用 phpMyAdmin 的唯一方法是在服务器上安装和配置它 - 解决这个问题的最简单方法是简单地卸载它,或者如果你不能这样做,请使用 SSL 连接和强密码。
其他要考虑的事情是锁定服务器 - 首先,您可以确保 MySQL 只接受来自 localhost 或本地网络的连接。
至于实际问题 - 我不知道如何以有效的方式加密整个数据库。您当然可以加密数据,但考虑到无论如何您都需要将解密代码放在服务器上,这样做的好处是没有意义的......如果有人可以访问服务器,他们仍然可以访问数据。最好的办法是从一开始就阻止这种访问。
【讨论】:
这是一个 3 级问题。您必须保护几件事:
对于 1,您可以使用 SSL 和 HTTPS。
对于 2,请遵循系统管理员的最佳实践来设置密码、权限和更新(serverfault.com 是您的朋友)。这包括数据库管理员。
对于 3,您必须加密整个硬件。仅对数据库使用加密会破坏您的服务器性能。无论如何,使用加密都会减慢您的系统速度,但如果网络应用程序死路一条,则在文件系统之上进行加密。此外,用于在加密硬盘驱动器上运行整个 Linux 系统的工具非常成熟(在 Ubuntu 上,LVM 让您几乎可以透明地做到这一点)。
正如您所注意到的,这与 Symfony 无关。
【讨论】:
这可能有点幼稚,但是在写入数据库之前简单地在服务器 [php 我假设] 端进行加密,然后在读取时将其解密回来怎么样?您的问题似乎是您不希望服务器管理员轻松读取您的数据。如果您使用 Symfony,您可能可以在模型中进行足够深入的操作,而无需更改代码。
经过一番挖掘,如果我觉得特别勇敢,我会这样做。
在 xxx/symfony/vendor/propel/util/BasePeer.php 中编辑 buildParams(),在 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/propel 写入最终都会调用该函数,因此您写入数据库的所有内容都会使用 your_encryption_method() 加密。
试试这个,如果它有效并且你仍然感到勇敢,请修改 xxx/symfony/vendor/propel-generator/classes/propel/engine/builder/ 中的 addHydrate() 函数om/php5/PHP5BasicObjectBuilder.php(第 668 行),以便在您调用 symfony propel-build-model 或 symfony-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);
";
你想把它修改成类似于
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 propel-build-model 并告诉我它是否有效 :-)。祝你好运,你可能已经知道这一点,但是在修改这些文件之前先备份它们……哦,因为你正在修改核心 symfony,你的其他项目会有问题,除非你希望它们都将加密数据写入分贝
【讨论】: