2009-11-18 4 views
0

J'essayais de crypter des données de cookie avec md5, mais je ne peux pas valider le hachage.md5 chiffrer cookiedata avec tableau sérialisé

Cela doit être fait, avec le fait que cookie_data est un tableau sérialisé, car les valeurs de chaîne normales fonctionnent bien.

C'est en fait une classe de codeigniter, mais ça ne marche pas? Est-ce que quelqu'un sait quel pourrait être le problème?

$hash = substr($session, strlen($session)-32); 
$session= substr($session, 0, strlen($session)-32); 

if ($hash !== md5($session.$this->encrypt_key)) 
{........ 

et la valeur du cookie est crypté comme celui-ci

$cookie_data = $cookie_data.md5($cookie_data.$this->encrypt_key); 

EDIT J'ai trouvé que la réponse est d'utiliser urlencode en urldecode dans les procès- de créer et de valider md5 hash, parce que setcookie fait urlencode automatiquement, et peut-être changer le hash.

merci, Richard

+1

Vous voudrez peut-être essayer HMAC pour l'authentification du message. – Gumbo

+0

titre de mise à jour de la question – jldupont

+0

hmac? Je vais chercher ça, mais y a-t-il quelque chose que je puisse faire pour que ça marche encore? – Richard

Répondre

2

md5 est une fonction à sens unique. Ce n'est pas réversible, donc vous ne pouvez pas déchiffrer les données. La seule chose que vous pouvez faire est de crypter les données d'origine (si vous l'avez sauvegardé ailleurs) et de vérifier le résultat de ce second calcul.

Si la valeur récupérée et la nouvelle valeur calculée sont identiques, le hachage que vous avez reçu est valide (comme vous le faites dans votre code).

EDIT

Vous savez, avec seulement trois lignes de code, je suppose que certaines causes possibles:

  1. $ session ne contient au début de votre code la même valeur de cookie_data .
  2. vous utilisez des chaînes multi-octets et strlen quels mb conscient de ne pas (utiliser les idiomes substr ($ session, 0, -32) pour obtenir la partie de la charge utile de la chaîne.
  3. peut-être substr ne traite pas avec des chaînes multi-octets trop , utilisez explicitally mb_substr (ou peu importe son nom).

pour moi, le premier cas est le plus probable. pour ce que je peux voir.

+0

ok, j'ai utilisé les mauvais mots, mais ça vient du cadre CI, pourquoi ça ne marchera pas? – Richard

+1

Ajout d'une autre suggestion à la réponse (trop de texte pour les commentaires) – Eineki

+0

merci, pour moi le premier ne semble pas évident.Il reçoit le cookiedata comme un tableau sérialisé et le concède avec le hachage md5. La prochaine fois que la fonction est appelée, elle lit le cookie et fait ce qui précède. Il n'y a pas d'altération entre les cookies. Il est très simpel, si j'utilise une valeur forte pour les cookiedata, ça va bien. Cela me permettrait de comprendre que cela a quelque chose à voir avec la sérialisation. – Richard

4

Vous avez une faute de frappe:

md5($sessie.$this->encrypt_key)) 

devrait être

md5($session.$this->encrypt_key)) 

Si vous développez avec avis activés vous attraper ce genre de chose beaucoup plus facilement .

Vous n'êtes pas cryptage vos données, vous êtes signature il.

+0

désolé, c'est en fait ma traduction pour ce forum, excuse – Richard

1

je tentais pour chiffrer de cookies données avec md5, mais je ne peux pas déchiffrer en arrière pour la validation.

md5 n'est pas une méthode de cryptage. il crée un hachage à sens unique qui ne peut pas être retourné dans les données d'origine.

Si vous souhaitez crypter les données essayer mcrypt

+0

Il utilise MD5 uniquement pour l'authentification des messages. – Gumbo