Question

J'essaye de réparer des choses sur un site PHP. Il existe une paire de fonctions PHP:

function get_rnd_iv($iv_len) {
        $iv = '';
        while ($iv_len-- > 0) {
                $iv .= chr(mt_rand() & 0xff);
        }
        return $iv;
}
function md5_encrypt($plain_text, $password, $iv_len = 16) {
        $plain_text .= "\x13";
        $n = strlen($plain_text);
        if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
        $i = 0;
        $enc_text = get_rnd_iv($iv_len);
        $iv = substr($password ^ $enc_text, 0, 512);
        while ($i < $n) {
                $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
                $enc_text .= $block;
                $iv = substr($block . $iv, 0, 512) ^ $password;
                $i += 16;
        }
        return base64_encode($enc_text);
}
function md5_decrypt($enc_text, $password, $iv_len = 16) {
        $enc_text = base64_decode($enc_text);
        $n = strlen($enc_text);
        $i = $iv_len;
        $plain_text = '';
        $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
        while ($i < $n) {
                $block = substr($enc_text, $i, 16);
                $plain_text .= $block ^ pack('H*', md5($iv));
                $iv = substr($block . $iv, 0, 512) ^ $password;
                $i += 16;
        }
        return preg_replace('/\\x13\\x00*$/', '', $plain_text);
}

Ils sont utilisés pour crypter les adresses IP des utilisateurs dans la base de données. Le paramètre $ password est stocké dans un fichier de configuration php (donc seul le vidage du sql ne vous donnera pas les adresses IP même lorsque vous connaissez ces fonctions).

Je suis toujours perplexe à leur sujet car MD5 est clairement du hachage et seules des choses comme le bruteforcing peuvent l'inverser.

Quelqu'un avec plus d'expérience PHP peut-il expliquer comment fonctionne ce décryptage? Le texte chiffré n'est pas un simple MD5, donc je devrai peut-être comprendre ce qui s'y passe.

Quoi qu'il en soit, j'essaie d'écrire une fonction stockée mysql effectuant le décryptage, car je veux rejoindre une autre table par les IP-s (une table contenant des plages d'adresses IP pour les pays), et ne renvoyer que les codes de pays dans la requête .

Les problèmes sont les suivants: je n'ai jamais écrit de fonction MySQL. Comment créer un cycle while? il y a des fonctions comme pack et preg_replace qui ne sont pas intégrées dans MySQL, dois-je les implémenter aussi d'une manière ou d'une autre?

Toute aide serait appréciée (allant des astuces à la fonction complète)!

Commentaires comme "MD5 ne peut pas être déchiffré, c'est du hachage!" ne sera pas apprécié.

Était-ce utile?

La solution

Dans ces fonctions, md5 n'est utilisé que pour calculer le hachage du composant constant $iv_len, qui est plus tard utilisé comme salt pour les mots de passe.

Toutes les autres opérations sont réversibles (remplissage de chaîne, compression et XOR [^])

Quant à la fonction MySQL, je ne le ferais pas.La meilleure solution à mon humble avis est d'étendre la table des utilisateurs avec la colonne country_from_ip et de la remplir à partir de php, en déchiffrant toutes les adresses IP existantes et en obtenant leur code de pays et en modifiant le code php pour ajouter ces informations tout en enregistrant un nouvel enregistrement.

Faire une jointure sur un champ calculé par fonction deviendra très vite un goulot d'étranglement pour votre application

Autres conseils

Le hachage MD5 n'est pas effectué sur l'adresse IP, il semble être utilisé pour ajouter des données de départ aléatoires au chiffrement, ou quelque chose.

Quant à savoir comment le déchiffrer, pourquoi voulez-vous utiliser SQL?Bien que cela soit probablement possible, je soupçonne que PHP est beaucoup plus rapide dans ce type d'opération.

Utilisez SQL pour sélectionner, par exemple, 1000 lignes utilisateur à la fois, puis utilisez PHP pour les lier à chaque pays.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top