Warum erzeugen diese PHP- und Java-Passwortgeneratoren unterschiedliche Ausgaben? [duplicate]

Lesezeit: 3 Minuten

Benutzeravatar von tmadam
tmadam

Ich schreibe einen Passwortgenerator für ein Skript in PHP und möchte, dass es mit einer Klasse kompatibel ist, die ich in Java geschrieben habe, damit sie Ressourcen gemeinsam nutzen können.

PHP-Code:

public function PasswordGen($password, $rounds) { 
    for($i = 0; $i < $rounds; $i++) { 
        $password = substr(base64_encode(md5($password)), 0, 16); 
        echo $i . " " . $password . PHP_EOL; // debugging //
    }
    return $password;
}

Java-Code:

public static String PasswordGen(String password, int rounds) {
    try { 
        for(int i = 0; i < rounds; i++) { 
            byte[] md5 = MessageDigest.getInstance("MD5").digest(password.getBytes("UTF-8"));
            String md5h = (new BigInteger(1, md5)).toString(16);
            password = Base64.getEncoder().encodeToString(md5h.getBytes()).substring(0, 16);
            System.out.println(Integer.toString(i) + " " + password); // debugging //
        }
    } catch(Exception ex) {
        ex.printStackTrace();
        return null;
    }
    return password;
}

PHP-Debug-Ausgabe:

0 MWExZGM5MWM5MDcz  
1 NDVkZmMxNWVjNWZi  
2 ODY5YzVkODBhNTRh  
3 ZGE2OTNiOWMxOWM1  
4 OTcxMTY3MzgxMmRk  
5 NWNjNDI2N2IzMDlj  
6 NGVkYzY0YjVkMWUy  
7 MjdhMGU4NjhhNmU3  
8 OWY5OGE3ZGZiODZl  
9 Y2I1ZjBkNjRmMjkx  
10 YTk5NDA1MGI1OWY1  
11 YzRmYWE5ZTk0ZDdl  
12 NDBiZWZkNmQ5Yjhj  
13 MzQyNzcwNGRjMTYw  
14 N2U4ZmUxOGMyNWYx  
15 MjBjOTZhNGE4ZDQ1  
16 MjdmMzkwMzI0NDdj  
17 YjM4NDI0YWU0YzUw  
18 NDRiNjA1MWUwOGZi  
19 MGI1YmIyMDViMGYz  

Java-Debug-Ausgabe:

0 MWExZGM5MWM5MDcz  
1 NDVkZmMxNWVjNWZi  
2 ODY5YzVkODBhNTRh  
3 ZGE2OTNiOWMxOWM1  
4 OTcxMTY3MzgxMmRk  
5 NWNjNDI2N2IzMDlj  
6 NGVkYzY0YjVkMWUy  
7 MjdhMGU4NjhhNmU3  
8 OWY5OGE3ZGZiODZl  
9 Y2I1ZjBkNjRmMjkx  
10 YTk5NDA1MGI1OWY1  
11 YzRmYWE5ZTk0ZDdl  
12 NDBiZWZkNmQ5Yjhj  
13 MzQyNzcwNGRjMTYw  
14 N2U4ZmUxOGMyNWYx  
15 MjBjOTZhNGE4ZDQ1  
16 MjdmMzkwMzI0NDdj  
17 YjM4NDI0YWU0YzUw  
18 NDRiNjA1MWUwOGZi  
19 YjViYjIwNWIwZjMy  

Es funktioniert wie erwartet bis zur 19. Schleife. Warum erzeugt es danach eine andere Ausgabe?

  • Vielleicht möchten Sie einen Blick auf Wie erstellen Sie “gute” zufällige MD5-Hashes in PHP?

    – Mike32

    4. April 2017 um 3:36 Uhr


  • Ich kenne Ihren Schlüssel nicht, daher kann ich ihn nicht testen, aber Ihr Problem könnte möglicherweise dadurch verursacht werden: md5h.getBytes(). In der vierten Zeile des von Ihnen geposteten Java-Codes verwenden Sie eine Codierung von UTF-8, aber nicht in Zeile 6.

    – Jakob G.

    4. April 2017 um 3:37 Uhr

  • Gib den Schlüssel, damit wir versuchen können, ihn zu reproduzieren.

    – Erwin Bolwidt

    4. April 2017 um 3:43 Uhr

  • @JacobG. Ich glaube nicht, dass das das Problem sein könnte, denn zu diesem Zeitpunkt key besteht nur aus ASCII-Zeichen.

    – Dawud ibn Kareem

    4. April 2017 um 3:44 Uhr

  • @ErwinBolwidt Sie benötigen den Originalschlüssel nicht, wenn Sie dies reproduzieren möchten. Sie können bei der 18. Iteration beginnen (NDRiNjA1MWUwOGZi) und nur einmal iterieren.

    – Dawud ibn Kareem

    4. April 2017 um 3:45 Uhr

Konvertieren Sie in Java einen BigDecimal in einen hexadezimalen String mit dem toString(int base) Methode gibt keine führenden Nullen aus.

Sie können dies feststellen, indem Sie die Ausgabe des Zwischenschritts (Konvertieren des md5-Hashcodes in eine hexadezimale Zeichenfolge) drucken – in Java gibt das b5bb205b0f32a7bf2a80fc870cbd2b7 während es in PHP gibt 0b5bb205b0f32a7bf2a80fc870cbd2b7. Es ist nur ein Unterschied von einer führenden Null, aber nach Anwendung der base64-Codierung sehen sie sehr unterschiedlich aus.

Eine einfachere Möglichkeit, führende Nullen zu erhalten, ist die Verwendung von String.format Methode.

Ersetzen Sie diese Zeile:

String md5h = ( new BigInteger(1, md5) ).toString(16);

mit dieser Zeile:

String md5h = String.format("%032x", new BigInteger(1, md5));

und Sie erhalten die gleiche Ausgabe wie mit Ihrem PHP-Code.

1405610cookie-checkWarum erzeugen diese PHP- und Java-Passwortgeneratoren unterschiedliche Ausgaben? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy