Question

Certaines chaînes cryptées à l'aide de la fonction PHP crypt () .

Les sorties ressemblent à ceci:

$1$Vf/.4.1.$CgCo33ebiHVuFhpwS.kMI0
$1$84..vD4.$Ps1PdaLWRoaiWDKCfjLyV1
$1$or1.RY4.$v3xo04v1yfB7JxDj1sC/J/

Bien que je pense que crypt () utilise l'algorithme MD5, les sorties ne sont pas des hachages MD5 valides.

Existe-t-il un moyen de convertir les hachages produits en des hachages MD5 valides (valeurs hexadécimales de 16 octets)?

Mise à jour:

Merci pour les réponses donc réponses jusqu'à présent. Je suis à peu près sûr que la fonction de cryptage utilisée utilise une sorte d'algorithme MD5. Ce que je cherche à faire est de convertir la sortie que j’ai en un hachage MD5 qui ressemble à ce qui suit:

9e107d9d372bb6826bd81d3542a419d6  
e4d909c290d0fb1ca068ffaddf22cbd0  
d41d8cd98f00b204e9800998ecf8427e

(extrait de Wikipedia )

Existe-t-il un moyen de convertir les hachages dont je dispose en ceux ci-dessus?

Était-ce utile?

La solution

OK, cette réponse a peut-être un an de retard, mais je vais tenter le coup. Dans votre propre réponse, vous notez que crypt () utilise le FreeBSD MD5, qui effectue également d’intéressantes transformations sur le sel avant d'exécuter le hachage, donc le résultat de ce que je vais vous donner. ne correspondra jamais aux résultats d'un appel à md5 () . Cela dit, la seule différence entre la sortie que vous voyez et le format auquel vous êtes habitué est que la sortie que vous voyez est codée comme suit

$1$        # this indicates that it is MD5
Vf/.4.1.   # these eight characters are the significant portion of the salt
$          # this character is technically part of the salt, but it is ignored
CgCo33eb   # the last 22 characters are the actual hash
iHVuFhpw   # they are base64 encoded (to be printable) using crypt's alphabet
S.kMI0     # floor(22 * 6 / 8) = 16 (the length in bytes of a raw MD5 hash)

À ma connaissance, l'alphabet utilisé par crypt se présente comme suit:

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Donc, en gardant cela à l’esprit, voici comment convertir le hachage crypt-base64 de 22 caractères en un hachage base16 (hexadécimal) de 32 caractères:

Tout d'abord, vous avez besoin de quelque chose pour convertir le base64 (avec l'alphabet personnalisé) en un hachage MD5 brut de 16 octets.

define('CRYPT_ALPHA','./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
/**
 * Decodes a base64 string based on the alphabet set in constant CRYPT_ALPHA
 * Uses string functions rather than binary transformations, because said
 * transformations aren't really much faster in PHP
 * @params string $str  The string to decode
 * @return string       The raw output, which may include unprintable characters
 */
function base64_decode_ex($str) {
    // set up the array to feed numerical data using characters as keys
    $alpha = array_flip(str_split(CRYPT_ALPHA));
    // split the input into single-character (6 bit) chunks
    $bitArray = str_split($str);
    $decodedStr = '';
    foreach ($bitArray as &$bits) {
        if ($bits == '

Maintenant que vous avez les données brutes, vous aurez besoin d'une méthode pour les convertir au format base 16 que vous attendez, ce qui ne pourrait être plus simple.

/**
 * Takes an input in base 256 and encodes it to base 16 using the Hex alphabet
 * This function will not be commented.  For more info:
 * @see http://php.net/str-split
 * @see http://php.net/sprintf
 *
 * @param string $str   The value to convert
 * @return string       The base 16 rendering
 */
function base16_encode($str) {
    $byteArray = str_split($str);
    foreach ($byteArray as &$byte) {
        $byte = sprintf('%02x', ord($byte));
    }
    return join($byteArray);
}

Enfin, puisque la sortie de crypt contient beaucoup de données dont nous n’avons pas besoin (et qu’en fait nous ne pouvons pas utiliser) pour ce processus, une fonction courte et agréable permet non seulement de lier ces deux éléments, mais aussi de permettre une connexion directe. entrée de sortie de crypt.

/**
 * Takes a 22 byte crypt-base-64 hash and converts it to base 16
 * If the input is longer than 22 chars (e.g., the entire output of crypt()),
 * then this function will strip all but the last 22.  Fails if under 22 chars
 *
 * @param string $hash  The hash to convert
 * @param string        The equivalent base16 hash (therefore a number)
 */
function md5_b64tob16($hash) {
    if (strlen($hash) < 22) {
        return false;
    }
    if (strlen($hash) > 22) {
        $hash = substr($hash,-22);
    }
    return base16_encode(base64_decode_ex($hash));
}

Étant donné ces fonctions, les trois exemples de base16 sont les suivants:

3ac3b4145aa7b9387a46dd7c780c1850
6f80dba665e27749ae88f58eaef5fe84
ec5f74086ec3fab34957d3ef0f838154

Bien sûr, il est important de se rappeler qu'ils étaient toujours valables, mais formatés différemment.

) { // $ indicates the end of the string, to stop processing here break; } if (!isset($alpha[$bits])) { // if we encounter a character not in the alphabet return false; // then break execution, the string is invalid } // decbin will only return significant digits, so use sprintf to pad to 6 bits $decodedStr .= sprintf('%06s', decbin($alpha[$bits])); } // there can be up to 6 unused bits at the end of a string, so discard them $decodedStr = substr($decodedStr, 0, strlen($decodedStr) - (strlen($decodedStr) % 8)); $byteArray = str_split($decodedStr, 8); foreach ($byteArray as &$byte) { $byte = chr(bindec($byte)); } return join($byteArray); }

Maintenant que vous avez les données brutes, vous aurez besoin d'une méthode pour les convertir au format base 16 que vous attendez, ce qui ne pourrait être plus simple.

<*>

Enfin, puisque la sortie de crypt contient beaucoup de données dont nous n’avons pas besoin (et qu’en fait nous ne pouvons pas utiliser) pour ce processus, une fonction courte et agréable permet non seulement de lier ces deux éléments, mais aussi de permettre une connexion directe. entrée de sortie de crypt.

<*>

Étant donné ces fonctions, les trois exemples de base16 sont les suivants:

<*>

Bien sûr, il est important de se rappeler qu'ils étaient toujours valables, mais formatés différemment.

Autres conseils

$ 1 $ signifie en effet qu'il s'agit d'un hachage MD5, mais crypt génère un sel aléatoire. C'est pourquoi vous trouvez une valeur MD5 différente. Si vous incluez le sel généré, vous obtiendrez le même résultat.

Le sel est codé en base64 dans la sortie, sous forme de hachage.

L’algorithme utilisé est un paramètre à l’échelle du système. Généralement, c’est le MD5, vous avez raison.

Je pense que la réponse à ma question initiale est non, vous ne pouvez pas convertir d'un format à l'autre.

Les hachages générés par php crypt () semblent être générés par une version de l’implémentation du hachage FreeBSD MD5 créée par Poul-Henning Kamp.

http://people.freebsd.org/~phk/

Dans la documentation, cela dépend du système. Vous pouvez forcer l'algorithme utilisé en définissant le paramètre salt. À partir de la documentation:

  

Le type de cryptage est déclenché par   l'argument de sel. Au moment de l'installation,   PHP détermine les capacités du   fonction de cryptage et acceptera les sels   pour d'autres types de cryptage. Si pas de sel   est fourni, PHP générera automatiquement un   sel standard à deux caractères par   default, sauf si le cryptage par défaut   tapez sur le système est MD5, dans lequel   cas, un sel aléatoire compatible MD5 est   généré.

De http://php.net/crypt :

  

crypt () renverra une chaîne chiffrée en utilisant l'algorithme de chiffrement standard basé sur DES Unix ou d'autres algorithmes disponibles sur le système.

Vous souhaitez que la fonction md5 () :

  

Calcule le hachage MD5 de str en utilisant le paramètre & # 187; Algorithme MD5 Message-Digest de RSA Data Security, Inc., et renvoie ce hachage.
  Si le paramètre raw_output facultatif est défini sur TRUE, le condensé md5 est à la place renvoyé au format binaire brut d’une longueur de 16.   La valeur par défaut est FALSE.

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