2010-07-15 23 views
9

Informations générales:

Je fais partie d'une équipe de développeurs qui exécute une application Web qui stocke et récupère les données HIPAA (médicales). Récemment, les directives HIPAA ont été mises à jour pour inclure une politique qui exige que toutes les informations d'identification du client soient cryptées lorsqu'elles sont "au repos" (stockées dans la base de données et inaccessibles).Surcharger une fonction PHP native pour crypter les données pour la conformité HIPAA

Le problème initial

Le premier problème que nous devions attaquer était de déterminer la meilleure façon de les deux sens Crypter les données d'une manière qui rend les données sécurisées en cas de violation.

La solution initiale

La solution la plus rapide, nous sommes arrivés avec était d'utiliser mcrypt pour chiffrer les données avant nous a inséré dans la base de données.

Le nouveau problème

L'application que nous développons est assez vieux (comme les applications web vont) et utilise beaucoup de programmation procédurale ainsi que la forte dépendance de la fonction mysql_query pour insérer, mettre à jour, récupérer et Suprimmer les données. Nous n'avons pas le temps ou le luxe de traduire notre code dans une couche d'abstraction de base de données. Ainsi, la seule façon de mettre en œuvre ce système de chiffrement/déchiffrement consiste à éditer manuellement toutes les requêtes CRUD pour utiliser les données qui ont été chiffrées via mcrypt. C'est très inefficace et extrêmement sujet aux erreurs.

Notre solution proposée

Nous avons décidé que le plus rapide et le plus efficace pour résoudre notre problème est de remplacer la fonction mysql_query native avec l'un de nos propre conception. Dans notre nouvelle fonction, nous chiffrerions/déchiffrerions les valeurs de données avant d'envoyer la requête au serveur/de renvoyer le jeu de résultats.

où vous Folks Come In

  1. Est-ce la meilleure solution pour résoudre notre problème initial?
  2. Comment allez-vous écraser une fonction PHP existante?
+0

Le problème est de chiffrer les données alors qu'il a été transféré au serveur DB? Ou stocker dans un cryptage? –

+0

Pour le stocker de manière cryptée, puis le récupérer, le déchiffrer et l'afficher au besoin. –

+0

Je pense que vous pouvez faire cela à la mauvaise couche. Avez-vous envisagé de chiffrer toute la base de données MySQL? Quelques solutions pour cela sont discutées dans [cette question] (http://stackoverflow.com/questions/143750/mysql-and-data-file-encryption). –

Répondre

3

Bien que vous ayez déjà déclaré que vous ne pouvez pas/ne traduisez pas votre code dans une couche d'abstraction de base de données, je crois que ce serait la solution idéale. Bien sûr, c'est beaucoup plus de travail en ce moment, mais ça rapporte. Ce que vous avez proposé est un hack, qui peut (et va probablement) conduire à des erreurs et des maux de tête à l'avenir. La meilleure solution serait de crypter la base de données entière, comme proposé dans les commentaires. Il existe des solutions pour le chiffrement transparent dans différents niveaux, à savoir: this ou this

Une autre chose que vous voudrez peut-être examiner est encryption and decryption natif de MySQL fonctions qui pourraient être utilisées pour mettre en œuvre le chiffrement au niveau de la colonne si vous êtes préoccupé par à propos de la performance.

+0

@Aircule Ok, ce genre de solution à un problème: Cryptage des données quand il va dans la base de données. Nous pourrions utiliser des déclencheurs pour chiffrer les données avant de les insérer ou de les mettre à jour. Cependant, qu'en est-il de la récupération de données? –

+0

@Levi Ne pouvez-vous pas le déchiffrer lors de la récupération? – quantumSoup

+0

@Aircule, oui nous pourrions mais nous devrions appeler notre fonction de décryptage manuellement avant d'imprimer les données pour chaque requête et il y a des milliers de requêtes codées en dur. –

0

Vous pouvez crypter au niveau du système de fichiers et laisser le système d'exploitation le gérer. Si vous souhaitez le gérer au niveau PHP, étendez, ne pas écraser.

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(); 
} 
2

Alors que la meilleure solution serait la couche d'abstraction que les autres réponses ont suggéré, vous pouvez remplacer les fonctions PHP existantes avec vos propres versions avec le PECL Runkit extension

Quelque chose comme:

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); 
} 

Remarque: Par défaut, seules les fonctions de l'espace utilisateur peuvent être supprimées, renommées ou modifiées. Pour remplacer les fonctions internes , vous devez activer le paramètre runkit.internal_override dans php.ini.

Ce n'est pas une solution que je recommande vraiment. J'ai dû faire quelque chose de similaire il y a quelques années dans java, où il était beaucoup plus facile d'étendre jdbc; mais si l'analyse de la syntaxe des requêtes SQL est assez difficile, cela devient encore plus difficile si vos requêtes utilisent des variables de liaison. Attention aux cordes échappées! Attention à toute utilisation de fonction connexe comme mysql_db_query, juste au cas où ils sont utilisés avec mysql_query dans l'application!

Toutes mes excuses pour un typage tremblant. Ma femme a été rebondissant notre routeur quelques fois pendant I'be été écrit cette suggestion

+0

Qu'est-ce que votre routeur doit faire avec votre clavier? – blockhead

+0

Chaque fois qu'elle le fait, ça me donne la nervosité –

1

Je pense que d'une façon de traiter ce serait automatiquement regarder dans MySQL proxy

et mettre en œuvre le chiffrement par là. J'ai joué avec ça il y a environ 2 ans quand c'était à un stade très précoce, et d'après ce dont je me souviens, il pouvait fondamentalement intercepter des requêtes et faire des 'trucs' avec eux :) Aucun changement de code requis essentiellement. Espérons que cela aide.

1

Il existe des solutions disponibles dans le commerce pour faciliter le cryptage des données au repos. Vous pouvez consulter soit Gazzang ou Packet General. Les deux offrent le cryptage MySQL pour aider à la conformité HIPPA. Bonne chance

0

Je pense vraiment que vous regardez cela du mauvais point de vue. Ce n'est pas un problème à résoudre par les développeurs via le cryptage/décryptage des données que vous stockez et récupérez dans la base de données - utilisez une solution d'infrastructure. Considérer le chiffrement intégral du disque matériel ou logiciel, le chiffrement de la base de données elle-même via la fonction de chiffrement de données transparente du SGBDR (si le SGBDR en est un) ou via le système d'exploitation.

Voir this document from NIST