我使用symfony框架和Propel,我正在徘徊加密数据库的最简单方法。我不是在谈论密码而是所有的数据库。我为管理一些信息(用户帐户,密码等)的客户构建了一个小型Web应用程序,我不希望有人可以访问例如phpmyadmin。
答案 0 :(得分:2)
通常,您可以使用MySQL的内置权限来处理此问题。
有人可以使用phpMyAdmin的唯一方法是在服务器上安装和配置它 - 解决这个问题的最简单方法就是简单地卸载它,或者如果你不能这样做就使用SSL连接和强密码。 / p>
要考虑的其他事项是锁定服务器 - 首先,您可以确保MySQL只接受来自localhost或本地网络的连接。
关于实际问题 - 我知道无法以有效的方式加密整个数据库。你当然可以对数据进行加密,但鉴于你需要将解密代码放在服务器上,这样做的好处是没有意义的......如果有人可以访问服务器,他们仍然可以获得对数据的访问权限。最好的办法是首先防止访问。
答案 1 :(得分:1)
嗯,这可能有点天真,但是如果只是在写入数据库之前加密服务器[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写入数据库最终都会调用该函数,因此您写入db的所有内容都会使用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 <时,hydrate()代码就会为你生成/ strong>将自动解密数据库中的所有内容。
目前应该是
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,你的其他项目会有问题,除非你希望它们都将加密数据写入分贝
答案 2 :(得分:0)
这是一个3级问题。你必须保护好几件事:
对于1,您可以使用SSL和HTTPS。
对于2,请遵循sysadmin的最佳做法来设置密码,权限和更新(serverfault.com是您的朋友)。这包括数据库管理员。
对于3,您必须加密整个硬件。仅对数据库使用加密会破坏您的服务器性能。使用加密无论如何都会降低系统速度,但如果是Web应用程序的死胡同,则会在文件系统之上执行此操作。此外,在加密硬盘上运行整个Linux系统的工具已经相当成熟(在Ubuntu上,LVM可以让你几乎透明地完成)。
正如你所注意到的,这与Symfony毫无关系,无论如何。