преобразовать шифрование пароля из Java в PHP - PullRequest
0 голосов
/ 02 июня 2010

Я пытаюсь создать версию PHP существующей программы JSP, однако я застрял в части шифрования пароля.

Не могли бы вы сказать мне, как конвертировать этот? Я знаю, что он пытается получить md5 (), но после этого я не получаю его. Я заблудился в Stringbuffer и для () частей.

Вы можете мне помочь?

 public static String encryptPassword( String password ) 
 {
     String encrypted = "";
     try
     {
        MessageDigest digest = MessageDigest.getInstance( "MD5" ); 
        byte[] passwordBytes = password.getBytes( ); 

        digest.reset( );
        digest.update( passwordBytes );
        byte[] message = digest.digest( );

        StringBuffer hexString = new StringBuffer();
        for ( int i=0; i < message.length; i++) 
        {
            hexString.append( Integer.toHexString(
                0xFF & message[ i ] ) );
        }
        encrypted = hexString.toString();
     }
     catch( Exception e ) { }
     return encrypted; 
 }

Ответы [ 4 ]

3 голосов
/ 02 июня 2010

Ираклис должен быть прав. md5() дает вам шестнадцатеричную строку вывода по умолчанию. Вы получите только незакодированные байты, как в Java, передав TRUE для необязательного аргумента $raw_output.

длина варьируется от 29 до 32

Тогда в вашем Java-коде есть ошибка. Хеши MD5 всегда 128 бит (32 шестнадцатеричные цифры). Вот оно:

hexString.append( Integer.toHexString(0xFF & message[ i ] ) );

это сгенерирует 1 вместо 01 для всех байтов ниже 16. Вы сохранили искаженный хеш, из которого вы не можете восстановить исходное значение MD5. Если вам абсолютно необходимо сохранить эти поврежденные данные, вам придется воспроизвести ошибку в PHP:

function makeBrokenMD5($s) {
    $hash= md5($s, TRUE);
    $bytes= preg_split('//', $hash, -1, PREG_SPLIT_NO_EMPTY);
    $broken= '';
    foreach ($bytes as $byte)
        $broken.= dechex(ord($byte));
    return $broken;
}
1 голос
/ 02 июня 2010
<?php
$password = "MyPass";
$hash = md5($password);
?>

UPDATE: Есть некоторые расхождения между двумя версиями. Чтобы исправить это, смотрите ответ @bobince. Вот код теста:

Java

package tests;

import java.security.MessageDigest;

/**
 * Created by IntelliJ IDEA.
 * User: Iraklis
 * Date: 2 Ιουν 2010
 * Time: 2:15:03 μμ
 * To change this template use File | Settings | File Templates.
 */
public class Md5Test {
    public static String encryptPassword(String password) {
        String encrypted = "";
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] passwordBytes = password.getBytes();

            digest.reset();
            digest.update(passwordBytes);
            byte[] message = digest.digest();

            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < message.length; i++) {
                hexString.append(Integer.toHexString(
                        0xFF & message[i]));
            }
            encrypted = hexString.toString();
        }
        catch (Exception e) {
        }
        return encrypted;
    }

    public static void main(String[] args) {
        System.out.println("Pass1 md5 = " + encryptPassword("Test123FORXTREMEpass"));
        System.out.println("Pass1 md5 = " + encryptPassword("Ijdsaoijds"));
        System.out.println("Pass1 md5 = " + encryptPassword("a"));
        System.out.println("Pass1 md5 = " + encryptPassword(" "));
    }

}


Output:
Pass1 md5 = dc3a7b42a97a3598105936ef22ad2c1
Pass1 md5 = df7ca542bdbf7c4b8776cb21c45e7eef
Pass1 md5 = cc175b9c0f1b6a831c399e269772661
Pass1 md5 = 7215ee9c7d9dc229d2921a40e899ec5f

PHP

<?php
echo "Pass1 md5 = ".md5("Test123FORXTREMEpass")."<BR>";
echo "Pass2 md5 = ".md5("Ijdsaoijds")."<BR>";
echo "Pass3 md5 = ".md5("a")."<BR>";
echo "Pass4 md5 = ".md5(" ")."<BR>";
?>

выход:

Pass1 md5 = dc3a7b42a97a35981059036ef22ad2c1
Pass2 md5 = df7ca542bdbf7c4b8776cb21c45e7eef
Pass3 md5 = 0cc175b9c0f1b6a831c399e269772661
Pass4 md5 = 7215ee9c7d9dc229d2921a40e899ec5f
1 голос
/ 02 июня 2010

Преобразует хеш MD5 в строку шестнадцатеричных чисел младшего значащего байта символа. В Java все символы имеют размер 2 байта.

На практике это означает только значение ASCII.

0 голосов
/ 02 марта 2016

Чтобы получить одинаковые результаты в java и php, я использовал это.

Java (обязательно вызовите метод внутри блока try):

public static String getHash(String pass) throws Exception
{
    MessageDigest md=MessageDigest.getInstance("MD5");
    md.update(pass.getBytes(),0,pass.length());
    return new BigInteger(1,md.digest()).toString(16);
}

PHP:

<?php
echo md5(pass);
?>

Надеюсь, это поможет

Редактировать: Если вариант java возвращает 31 символ, перед строкой добавляется «0», чтобы соответствовать хэшу php, который возвращает 32 символа.

...