Frage

Ich habe ein paar Strings, die den PHP-Funktion crypt() verschlüsselt wurden.

Die Ausgänge in etwa so aussehen:

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

Während ich Krypta glauben () wird der MD5-Algorithmus verwendet wird, sind die Ausgänge nicht gültig MD5-Hashes.

Gibt es eine Möglichkeit, die erzeugten Hash-Werte in gültigen MD5-Hashes der Umwandlung (16-Byte-Hex-Wert)?


Update:

Danke für die Antworten so Antworten bisher. Ich bin mir ziemlich sicher, dass die Krypta-Funktion verwendet wird, ist eine Art von MD5-Algorithmus. Was ich suche zu tun ist, um die ouput zu konvertieren, die ich in einen MD5-Hash, die etwa wie folgt aussieht:

9e107d9d372bb6826bd81d3542a419d6  
e4d909c290d0fb1ca068ffaddf22cbd0  
d41d8cd98f00b204e9800998ecf8427e

(aus Wikipedia )

Gibt es eine Möglichkeit von dem Hashes der Umwandlung ich solche wie die oben habe?

War es hilfreich?

Lösung

OK, vielleicht diese Antwort ist ein Jahr zu spät, aber ich werde es einen Schuss. In Ihrer eigenen Antwort, beachten Sie, dass crypt() die FreeBSD MD5 verwendet, die auch einige interessanten Transformationen auf dem Salz tut vor dem Hash ausgeführt wird, so dass das Ergebnis von dem, was ich Ihnen mit den Ergebnissen nie ganz zusammenpassen geben von ein Aufruf an md5(). Das heißt, der einzige Unterschied zwischen den Ausgang Sie sehen und das Format, das Sie verwendet werden, ist, dass die Ausgabe, die Sie verschlüsselt sehen wie folgt

$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)

Meines Wissens das Alphabet von Krypta verwendet sieht wie folgt aus:

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Also, mit all dieser borne im Auge, hier ist, wie Sie die Krypta-base64 Hash-22 Zeichen umwandeln können in einen 32-Zeichen-Base16 (hexadezimal) hash:

Zuerst müssen Sie etwas, um das base64 zu konvertieren (mit eigenem Alphabet) in einen rohen 16-Byte-MD5-Hash.

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 == '$') { // $ 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);
}

Nun, da Sie die Rohdaten haben, erhalten Sie eine Methode benötigen, um es in das Format der Basis 16 zu konvertieren Sie erwarten, das könnte nicht einfacher sein.

/**
 * 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);
}

Schließlich, da die Ausgabe der Krypta eine Menge Daten enthält die wir nicht brauchen (und in der Tat, kann nicht verwendet werden) für diesen Prozess, eine kurze und süße Funktion nicht nur diese beiden zusammen zu binden, sondern für den direkten zu ermöglichen Eingabe der Ausgabe von Krypta.

/**
 * 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));
}

diese Funktionen gegeben, die Base16 Darstellung Ihrer drei Beispiele sind:

3ac3b4145aa7b9387a46dd7c780c1850
6f80dba665e27749ae88f58eaef5fe84
ec5f74086ec3fab34957d3ef0f838154

Natürlich ist es wichtig, sich daran zu erinnern, dass sie immer gültig waren, nur anders formatiert.

Andere Tipps

in der Tat $ 1 $ bedeutet, dass dies ein MD5-Hash, aber Krypta erzeugt eine zufällige Salz. Aus diesem Grunde Sie einen anderen MD5-Wert zu finden. Wenn Sie das erzeugte Salz enthalten werden Sie das gleiche Ergebnis finden.

Das Salz Base64 wird im Ausgang codiert, als hash.

Der verwendete Algorithmus ist ein systemweite Parameter. Im Allgemeinen ist dies MD5, Sie haben Recht.

Ich glaube, die Antwort auf meine ursprüngliche Frage nicht ist, kann man nicht von einem Format in das andere umwandeln.

Die Hashes von PHP-crypt () erzeugen erscheinen durch eine Version der FreeBSD MD5-Hash-Implementierung von Poul-Henning Kamp erstellt generieren werden.

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

Aus der Dokumentation hängt dies von dem System. Sie können den Algorithmus durch Einstellen des Salz Parameter erzwingen. Aus der Dokumentation:

  

Der Verschlüsselungstyp wird ausgelöst durch   das Salz Argument. Bei der Installation,   PHP bestimmt die Fähigkeiten der   Krypta Funktion und Salze akzeptieren   für andere Verschlüsselungstypen. Wenn kein Salz   vorgesehen ist, PHP wird eine automatisch generieren   Standard zwei Zeichensalz von   Standard, es sei denn, die Standard-Verschlüsselung   Typ auf dem System ist MD5, in denen   Fall wird ein Zufalls MD5-kompatiblen Salz   erzeugt wird.

http://php.net/crypt :

  

crypt () wird eine verschlüsselte Zeichenfolge zurück, den Standard-Unix-DES-Verschlüsselungsalgorithmus oder alternative Algorithmen, die auf dem System zur Verfügung stehen.

Sie wollen, dass die md5() Funktion:

  

Berechnet den MD5-Hash von str des »RSA Data Security, Inc. MD5 Message-Digest-Algorithmus, und gibt den Hashwert zurück.
  Wenn die optionale raw_output auf TRUE gesetzt ist, dann ist die md5 Digest wird stattdessen in Raw-Binary-Format mit einer Länge von 16 zurückgeführt.   Der Standardwert ist FALSE.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top