【问题标题】:How to encrypt database in symfony如何在 symfony 中加密数据库
【发布时间】:2010-11-22 04:24:46
【问题描述】:

我使用 symfony 框架和 Propel,我一直在寻找加密数据库的最简单方法。我说的不是密码,而是所有的数据库。我为管理一些信息(用户帐户、密码等)的客户端构建了一个小型 Web 应用程序,我不希望它在有人有权访问 phpmyadmin 时可见。

【问题讨论】:

    标签: php mysql encryption symfony1


    【解决方案1】:

    通常你会使用 MySQL 的内置权限来处理这个问题。

    有人可以使用 phpMyAdmin 的唯一方法是在服务器上安装和配置它 - 解决这个问题的最简单方法是简单地卸载它,或者如果你不能这样做,请使用 SSL 连接和强密码。

    其他要考虑的事情是锁定服务器 - 首先,您可以确保 MySQL 只接受来自 localhost 或本地网络的连接。

    至于实际问题 - 我不知道如何以有效的方式加密整个数据库。您当然可以加密数据,但考虑到无论如何您都需要将解密代码放在服务器上,这样做的好处是没有意义的......如果有人可以访问服务器,他们仍然可以访问数据。最好的办法是从一开始就阻止这种访问。

    【讨论】:

    • 我在共享主机上工作,所以我不能卸载 phpmyadmin 并且没有 ssl,我担心网络主机公司可以访问数据库并查看。即使代码在服务器上,加密密钥也可能是客户端用来登录其帐户的相同(或另一个)密码。所以你知道算法但不知道加密密钥。
    • 如果安全是这样一个问题,您不应该在共享主机上。至少,请确保主机信誉良好并具有可靠的安全策略。不确定我是否有更好的答案。
    【解决方案2】:

    这是一个 3 级问题。您必须保护几件事:

    1. 输入/输出数据所以它不能 被拦截。
    2. 管理员权限,因此您的系统不能被错误的人访问 工作时。
    3. 硬盘驱动器本身,所以如果有人可以直接访问 电脑,他将无法访问 甚至通过提取硬件。

    对于 1,您可以使用 SSL 和 HTTPS。

    对于 2,请遵循系统管理员的最佳实践来设置密码、权限和更新(serverfault.com 是您的朋友)。这包括数据库管理员。

    对于 3,您必须加密整个硬件。仅对数据库使用加密会破坏您的服务器性能。无论如何,使用加密都会减慢您的系统速度,但如果网络应用程序死路一条,则在文件系统之上进行加密。此外,用于在加密硬盘驱动器上运行整个 Linux 系统的工具非常成熟(在 Ubuntu 上,LVM 让您几乎可以透明地做到这一点)。

    正如您所注意到的,这与 Symfony 无关。

    【讨论】:

      【解决方案3】:

      这可能有点幼稚,但是在写入数据库之前简单地在服务器 [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-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);
      ";
      

      你想把它修改成类似于

      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,你的其他项目会有问题,除非你希望它们都将加密数据写入分贝

      【讨论】:

      • weeeeel....是的,那是我的问题。在 symfony 中最简单的方法是什么?如何使用 symfony 和 propel 加密数据库中的信息 :)
      • 你使用的是什么 Symfony 版本?
      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2018-10-18
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      相关资源
      最近更新 更多