9

背景情報:

私は、HIPAA (医療) データを保存および取得する Web アプリケーションを実行する開発者チームの一員です。最近、HIPAA ガイドラインが更新され、すべての識別クライアント情報が「保管中」 (データベースに保存され、アクセスされていないとき) に暗号化されることを要求するポリシーが含まれるようになりました。

最初の問題

最初に取り組まなければならなかった問題は、侵害が発生した場合にデータを安全にする方法でデータを双方向に暗号化する最善の方法を決定することでした。

最初の解決策

私たちが思いついた最も迅速な解決策は、データをデータベースに挿入する前に、 mcryptを使用してデータを暗号化することでした。

新しい問題

私たちが開発しているアプリケーションはかなり古く (Web アプリケーションのように)、多くの手続き型プログラミングを使用し、 mysql_query関数に大きく依存してデータを挿入、更新、取得、削除しています。コードをデータベース抽象化レイヤーに変換する時間や余裕はありません。したがって、この暗号化/復号化システムを実装する唯一の方法は、すべての CRUD クエリを手動で編集して、mcryptで暗号化されたデータを使用することです。これは非常に非効率的で、非常にエラーが発生しやすくなります。

私たちの提案するソリューション

私たちの問題を解決するための最速かつ最も効果的な方法は、ネイティブのmysql_query関数を独自の工夫で上書きすることであると判断しました。新しい関数では、クエリをサーバーに送信する前/結果セットを返す前に、データ値を暗号化/復号化します。

あなたの人々が来る場所

  1. これは、最初の問題を解決するための最良の解決策ですか?
  2. 既存のコア PHP 関数を上書きするにはどうすればよいでしょうか?
4

6 に答える 6

3

コードをデータベース抽象化レイヤーに変換できない/変換しないと以前に述べていましたが、それが理想的なソリューションになると思います。確かに、今はもっと多くの仕事をしていますが、報われます。あなたが提案したのはハックであり、将来的にエラーや頭痛につながる可能性があります (おそらくそうなるでしょう)。

次善の策は、コメントで提案されているように、データベース全体を暗号化することです。さまざまなレベルでの透過的な暗号化のソリューションがあります。つまり、これまたはこれ

もう 1 つ検討すべきことは、MySQL のネイティブの暗号化および復号化関数です。これは、パフォーマンスが気になる場合に列レベルの暗号化を実装するために使用できます。

于 2010-07-15T21:14:13.597 に答える
2

最善の解決策は、他の回答が示唆している抽象化レイヤーですが、PECLRunkit拡張機能を使用して既存の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設定を有効にする必要があります。

It's not a solution I'd really recommend. I had to do something similar some years back in java, where it was far easier to extend jdbc; but while parsing the syntax of SQL queries is hard enough, it gets harder still if your queries are using bind variables. Watch out for escaped strings! Watch out for any use of related function like mysql_db_query, just in case they're used alongside mysql_query within the application!

Apologies for shaky typing. My wife has been bouncing our router a few times while I'be been writing this suggestion

于 2010-07-15T22:57:28.270 に答える
1

保存データの暗号化に役立つ市販のソリューションがあります。Gazzang または Packet General のいずれかを確認できます。どちらも、HIPPA コンプライアンスに役立つ MySQL 暗号化を提供します。幸運を

于 2011-03-18T19:51:58.237 に答える
1

これを自動的に処理する1つの方法は、 MySQLプロキシを調べることだと思います

それを介して暗号化を実装します。2年ほど前、非常に初期の段階で遊んでいましたが、私が覚えていることから、基本的にリクエストを傍受し、それらを「処理」することができました:)基本的にコードの変更は必要ありません. うまくいけば、これが役に立ちます。

于 2010-07-16T00:25:58.997 に答える
0

ファイルシステムレベルで暗号化し、OSに処理させることができます。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

あなたはこれを間違った視点から見ていると本当に思います。これは、開発者がデータを保存してデータベースから取得するときにデータを暗号化/復号化することで解決できる問題ではありません。インフラストラクチャ ソリューションを使用してください。

ハードウェアまたはソフトウェアによるディスク全体の暗号化、RDBMS の透過的なデータ暗号化機能 (特定の RDBMS に機能がある場合) によるデータベース自体の暗号化、または OS による暗号化を検討してください。

NIST のこのドキュメントを参照してください

于 2011-09-27T18:10:32.583 に答える