背景资料:
我是一个开发团队的一员,它运行一个存储和检索HIPAA (医疗)数据的web应用程序。最近,对HIPAA指南进行了更新,以包含一项策略,该策略要求在“处于静止状态”时对所有标识客户端信息进行加密(存储在数据库中而不被访问)。
初始问题
我们必须解决的第一个问题是确定双向加密数据的最佳方式,使数据在发生泄露时安全。
初始解
我们想出的最快的解决方案是在将数据插入数据库之前使用密室加密数据。
新问题
我们正在开发的应用程序非常古老(作为web应用程序),它使用大量的过程编程以及对查询函数的大量依赖来插入、更新、检索和删除数据。我们没有时间或奢侈地将我们的代码转换成数据库抽象层。因此,实现这个加密/解密系统的唯一方法是手动编辑所有CRUD查询,以使用通过密室加密的数据。这是非常低效率和极容易出错。
我们提出的解决方案
我们决定,解决问题的最快和最有效的方法是用我们自己的设计之一覆盖本机查询函数。在我们的新函数中,我们将在将查询发送到服务器/返回结果集之前对数据值进行加密/解密。
你们进来的地方
发布于 2010-07-15 21:14:13
发布于 2010-07-15 22:57:28
虽然最好的解决方案是其他答案所建议的抽象层,但是您可以用自己的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);
}注意:默认情况下,只能删除、重命名或修改用户空间函数。为了覆盖内部函数,必须在runkit.internal_override中启用php.ini设置。
这不是我真正推荐的解决方案。几年前,我不得不在java中做一些类似的事情,在那里扩展jdbc要容易得多;但是,虽然解析SQL查询的语法足够困难,但如果您的查询使用绑定变量,则更加困难。小心逃脱的绳子!注意mysql_db_query等相关函数的任何使用,以防它们与应用程序中的mysql_query一起使用!
为不稳定的打字表示歉意。在我写这个建议的时候,我妻子已经把我们的路由器推了好几次了
发布于 2010-07-16 00:25:58
我认为自动处理这个问题的一种方法是查看MySQL代理
并通过它实现加密。大约两年前,当它还处于非常早期的阶段时,我就玩过了,据我所记得,它基本上可以拦截请求并与它们进行“东西”:)根本不需要进行任何代码更改。希望这能帮上忙。
https://stackoverflow.com/questions/3259931
复制相似问题