web-dev-qa-db-fra.com

Comment crypter une colonne spécifique dans une table MySQL?

J'expérimente avec la création d'une page de système de message simple (PHP) qui utilise une table MySQL pour stocker les entrées. Les grandes lignes des colonnes que j'utiliserai dans le tableau sont les suivantes:

msg_id (clé primaire, auto_increment)

ser_id (clé étrangère pointant vers l'utilisateur qui a créé le message)

time (une entrée DATETIME pour fournir des horodatages msg)

msg (un VARCHAR contenant le msg)

accessible (juste un int (1), 0 signifie que personne sauf l'utilisateur lui-même ne peut lire le msg, et 1 signifie que les autres peuvent le lire)

Ce que je me demande, c'est quelle est la meilleure façon de crypter le champ msg pour que les regards indiscrets ne puissent pas le lire (disons, en ouvrant la CLI mysql ou phpMyAdmin et en lisant simplement la valeur stockée dans un rangée)?

Si "accessible" est mis à 0, alors seul l'utilisateur lui-même devrait pouvoir le lire (en accédant à certains PHP), mais s'il est mis à 1, tout le monde devrait pouvoir pour le lire aussi. Je ne sais pas comment y faire face, donc toute aide est très appréciée!

16
BeeDog

Regardez ici pour la liste des fonctions de cryptage possibles:

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

Vous pouvez créer un déclencheur pour la mise à jour et vérifier le champ accessable. Quelque chose comme ca:

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 votre table avec cette requête:

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

Vous pouvez donc sélectionner des enregistrements pour vous PHP:

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

UPD. Également ici était une question similaire:

colonnes cryptées MySQL

20
rMX

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

8
Core Xii