2010-11-25 20 views
12

J'expérimente avec la création d'une page simple de système de message (PHP) qui utilise une table de MySQL pour stocker les entrées. L'ébauche des colonnes que je vais utiliser dans le tableau sont:Comment crypter une colonne spécifique dans une table MySQL?

id_msg (clé primaire, auto_increment)

user_id (pointage clé étrangère à l'utilisateur qui a créé le message)

temps (une date et une heure pour fournir des horodatages msg)

msg (a VARCHAR contenant le msg)

accessable (juste un int (1), 0 signifie que personne ne part de l'utilisateur lui-même peut lire le msg et 1 signifie que d'autres peuvent le lire)

Ce que je me demande est, quel est le meilleur façon de chiffrer le msg champ si les yeux indiscrets ne peuvent pas le lire (disons, en ouvrant la CLI mysql ou phpMyAdmin et juste lire la valeur stockée dans une rangée)? Si "accessable" est défini sur 0, seul l'utilisateur lui-même devrait être capable de le lire (en accédant à une page PHP), mais s'il est mis à 1, tout le monde devrait pouvoir le lire aussi. . Je ne sais pas comment aborder cela, donc toute aide est très appréciée!

Répondre

19

Regardez ici pour la liste des fonctions de chiffrement possibles:

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Vous pouvez créer déclencheur de mise à jour et vérifier l'accessable champ. Quelque chose comme ça:

CREATE TRIGGER crypt_trg BEFORE UPDATE ON table FOR EACH ROW 
BEGIN 
    IF new.accessable = 0 THEN 
    SET new.msg := ENCRYPT(new.msg, 'key'); 
    ELSE 
    SET new.msg := DECRYPT(new.msg, 'key'); 
    END IF; 
END; 

Vous pouvez également mettre à jour tous les enregistrements existants dans vous table avec cette requête:

UPDATE table SET msg = IF(accessable = 0, ENCRYPT(msg, 'key'), DECRYPT(msg, 'key')); 

Vous pouvez sélectionner les enregistrements pour votre code PHP:

SELECT msg_id, user_id, time, IF(accessable = 0, DECRYPT(msg, 'key'), msg) msg 
FROM table 

UPD. ici aussi était question similaire:

MySQL encrypted columns

+7

n'est-ce pas un peu bizarre de mettre la clé dans la gâchette? si on a accès à la base de données, il sera capable de voir la clé et de déchiffrer les données ... – Roey

+1

Je suis d'accord avec @Roey Passant la clé dans le déclencheur, fera tout chose inutile. –

6

Vous pouvez également chiffrer les données avant la requête pour l'insérer, de sorte que MySQL ne sait même pas il est crypté et décrypter sur la récupération dans la application. Pour cela, vous devez le stocker dans une colonne varbinary ou blob.

+0

Un blob sonne comme un type de données décent pour ce domaine d'utilisation particulier. Si je peux demander, pourriez-vous clarifier votre première phrase? En utilisant des blobs, comment se ferait le déchiffrement? Si l'administrateur MySQL sait que le type de données est un blob, ne peut-il pas le décrypter manuellement pour lire le contenu? – BeeDog

+1

Cryptage - Si vous connaissez la clé, vous pouvez déchiffrer les données.Si votre administrateur MySQL a accès à la clé utilisée pour crypter l'information, il peut bien entendu également la déchiffrer. C'est vrai pour la méthode _every_ que vous pourriez utiliser. Pour ce qui est de la manière d'endecrypter, cela dépend entièrement de votre application et des fonctionnalités qu'elle fournit, et des algorithmes que vous choisissez d'utiliser. –