9

背景资料:

我是一个开发人员团队的一员,该团队运行一个存储和检索 HIPAA(医疗)数据的 Web 应用程序。最近,HIPAA 指南进行了更新,其中包含一项政策,该政策要求所有可识别的客户信息在“静止”(存储在数据库中且未被访问)时进行加密。

最初的问题

我们必须解决的第一个问题是确定双向加密数据的最佳方式,以确保数据在发生泄露时安全。

初始解决方案

我们想出的最快解决方案是在将数据插入数据库之前使用mcrypt对其进行加密。

新问题

我们正在开发的应用程序相当老旧(就像 Web 应用程序一样),并且使用了大量的过程编程以及严重依赖mysql_query函数来插入、更新、检索和删除数据。我们没有时间或奢侈地将我们的代码翻译成数据库抽象层。因此,实现此加密/解密系统的唯一方法是手动编辑所有 CRUD 查询以使用通过mcrypt加密的数据。这是非常低效且极易出错的。

我们提出的解决方案

我们决定解决问题的最快和最有效的方法是用我们自己的设计之一覆盖本机mysql_query函数。在我们的新函数中,我们将在将查询发送到服务器/返回结果集之前加密/解密数据值。

你们进来的地方

  1. 这是解决我们最初问题的最佳解决方案吗?
  2. 您如何覆盖现有的核心 PHP 函数?
4

6 回答 6

3

尽管您之前已经说过您不能/不会将您的代码转换为数据库抽象层,但我相信这将是理想的解决方案。当然,现在还有很多工作要做,但它得到了回报。您提出的是一种 hack,它可能(并且可能会)在未来导致错误和令人头疼的问题。

下一个最好的事情是加密整个数据库,正如评论中所建议的那样。有针对不同级别的透明加密的解决方案,即:thisthis

您可能想要研究的另一件事是 MySQL 的本机加密和解密功能,如果您担心性能,可以使用它来实现列级加密。

于 2010-07-15T21:14:13.597 回答
2

虽然最好的解决方案是其他答案建议的抽象层,但您可以使用PECL Runkit 扩展使用您自己的版本覆盖现有的 PHP 函数

就像是:

runkit_function_rename ( 'mysql_query', 'mysql_query_old' );
function mysql_query ( $query , $link_identifier=null ) {
   // modify $query here for UPDATE/DELETE statement and any WHERE clause, etc
   $newQuery = modifyQuery($query);

   if (is_null($link_identifier)) {
      $result = mysql_query_old ( $newQuery);
   } else {
      $result = mysql_query_old ( $newQuery, $link_identifier);
   }
   // modify $result here for returned data from any SELECT statement
   return modifyResult($result);
}

注意:默认情况下,只能删除、重命名或修改用户空间函数。为了覆盖内部函数,您必须在 php.ini 中启用 runkit.internal_override 设置。

这不是我真正推荐的解决方案。几年前我不得不在java中做类似的事情,在那里扩展jdbc要容易得多;但是,虽然解析 SQL 查询的语法已经够难了,但如果您的查询使用绑定变量,它就会变得更加困难。注意转义的字符串!注意任何使用相关函数(如 mysql_db_query),以防它们在应用程序中与 mysql_query 一起使用!

为摇摇晃晃的打字道歉。在我写这个建议的时候,我的妻子一直在弹跳我们的路由器几次

于 2010-07-15T22:57:28.270 回答
1

我认为自动处理此问题的一种方法是查看MySQL 代理

and implement encryption through that. I played around with it 2 or so years ago when it was in a very early stages, and from what I remember it could basically intercept requests and do 'stuff' with them :) No code change required essentially. Hopefully this helps.

于 2010-07-16T00:25:58.997 回答
1

There are commercially available solutions to help with data at rest encryption. You can check out either Gazzang or Packet General. Both offer MySQL encryption to help with HIPPA compliance. Good Luck

于 2011-03-18T19:51:58.237 回答
0

您可以在文件系统级别加密,并让操作系统处理它。如果您希望在 PHP 级别处理它,请扩展,不要覆盖。

function mysqle_query() {
  // Do some stuff
  // like replace fieldnames with AES_ENCRYPT(fieldname) on insert and delete
  // and replace fieldnames with AES_DECRYPT(fieldname) on select
  mysql_query();
}
于 2010-07-15T21:45:58.363 回答
0

I really think you are looking at this from the wrong perspective. This is not a problem to be solved by developers via encrypting/decrypting data as you store and retrieve it from the database - use an infrastructure solution.

Consider hardware or software whole disk encryption, encryption of the database itself via the RDBMS's transparent data encryption function (if the particular RDBMS has one), or via the OS.

See this document from NIST

于 2011-09-27T18:10:32.583 回答