java dan php şifre şifreleme dönüştürmek

3 Cevap java

Varolan JSP programın bir PHP sürümünü oluşturmak çalışıyorum, ancak ben şifre şifreleme kısmında sıkışıp kaldım.

Eğer bu nasıl bir dönüştürmek için bana söyleyebilir misiniz? Ben (md5 almak için çalışır biliyorum) ama bundan sonra, ben alamadım. Ben StringBuffer ve () parçalar için kaybolmak.

Bana yardımcı olabilir misiniz?

 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; 
 }

3 Cevap

Iraklis doğru olmalıdır. md5() varsayılan bir onaltılık kodlanmış çıktı dize verir. Sadece isteğe bağlı $raw_output argüman için TRUE ileterek Java gibi unencoded byte olsun.

uzunlukları 29-32 aralığı

Sonra Java kodu bir hata var. MD5 sağlamalarının zaman 128 bit (32 onaltılık rakam) vardır. İşte:

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

Bu 1 yerine 01 16 altındaki tüm bayt için üretecektir. orijinal MD5 değeri kurtaramazsınız hangi Ne sakladığınız, bir karıştırılmış karma. Kesinlikle bu kırık veri tutmak gerekir, PHP hata yeniden sahip olacaktır:

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;
}

Bu karakterin en az significan byte bir dize onaltılık sayılara MD5 hash dönüştürür. Java'da tüm karakter 2 bayt.

Uygulamada bu sadece ASCII değer anlamına gelir.

<?php
$password = "MyPass";
$hash = md5($password);
?>

UPDATE: There are some discrepancies between the two versions. To fix this see @bobince answer.Here is the test code:

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>";
?>

çıktı:

Pass1 md5 = dc3a7b42a97a35981059036ef22ad2c1
Pass2 md5 = df7ca542bdbf7c4b8776cb21c45e7eef
Pass3 md5 = 0cc175b9c0f1b6a831c399e269772661
Pass4 md5 = 7215ee9c7d9dc229d2921a40e899ec5f