Я пытаюсь создать версию 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; }
Ираклис должен быть прав. По умолчанию 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; }
Он преобразует хэш MD5 в шестнадцатеричные числа строки наименьшего значащего байта символа. В Java все символы имеют 2 байта.
На практике это означает только значение ASCII.
<?php $password = "MyPass"; $hash = md5($password); ?>
ОБНОВЛЕНИЕ. Между двумя версиями существуют некоторые расхождения. Чтобы исправить это, см. @bobince answer.Here это тестовый код:
Ява
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
Чтобы получить те же результаты в 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 символа.