Подтвердить что ты не робот

Эквивалент функции PHP crypt в Java

Я переношу свой PHP-код в Google App Engine - Java.
Так что мне нужен эквивалент функции склепа PHP в Java,
поскольку я сохранил все пароли зарегистрированных пользователей
используя крипту в моей БД.

Изменить 1: Вот мой php-код для шифрования паролей:

$password = "test123";
$ pwd = crypt ($ password, $password);
echo $pwd;

Выход (On Windows, а также сервер на основе Linux на HostMonser):
temjCCsjBECmU

Может ли кто-нибудь дать мне эквивалентный java-код?
Я пробовал различные перестановки и комбинации с помощью MessageDigest, но не может понять это правильно.

Изменить 2:
Вот пример кода, который, как я думал, будет работать, но не сделал:

try {
                {
                    String password = "test123";
                    MessageDigest digest = MessageDigest.getInstance( "MD5" ); 
                    byte[] passwordBytes = password.getBytes( ); 

                    digest.reset( );
                    digest.update( passwordBytes );
                    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 ] ) );
                    }
                    String encrypted = hexString.toString();
                    System.out.println(encrypted);
                  } } catch (NoSuchAlgorithmException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
4b9b3361

Ответ 1

Вы должны знать, какая была реализация склепа PHP (MD5? SHA256? SHA512?), потому что в зависимости от вашей ОС несколько: http://php.net/manual/fr/function.crypt.php

Явный эквивалентный класс MessageDigest. Когда вы создаете экземпляр этого класса, вы предоставляете хэш-алгоритм, например:

MessageDigest md = MessageDigest.getInstance("MD5");
MessageDigest md2 = MessageDigest.getInstance("SHA-256");
MessageDigest md3 = MessageDigest.getInstance("SHA-512");
// etc.
byte[] encryptedPassword = md.digest("yourPassword".getBytes());

Ответ 2

Это старый поток, но я столкнулся с той же проблемой и нашел другое решение. Вы можете использовать классы UnixCrypt/Md5Crypt в библиотеке Apache Commons Codec 1.7.

Например, вы можете позвонить

UnixCrypt.crypt(string, salt)

ИЛИ

Md5Crypt.md5Crypt(byte[], salt)

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

Ответ 3

Кажется, вам нужно работать с устаревшей базой данных, уже заполненной паролями, которые вы не можете отменить, поэтому вы не можете просто переключиться на соленое MessageDigest, предпочтительно с использованием SHA-1. И ваша проблема усложняется, поскольку PHP-склеп - это оболочка, в которой может использовать один из нескольких алгоритмов. Но предположим, что ваш PHP использует оригинальный DES-основанный криптографический файл UNIX, тогда вам нужна реализация Java. Насколько я знаю, в стандартной установке Java не реализована криптография UNIX, но вы можете захотеть посмотреть здесь для списка варианты.

Ответ 4

Вам нужно взглянуть на классы java.security(что используется для JCE):

Там вы найдете все, что вам нужно, чтобы делать то, что вы хотите (в зависимости от того, какой алгоритм вам нужен).

http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/security/package-summary.html

например. MessageDigest для MD5/SHA и т.д.:

http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/security/MessageDigest.html

Отметьте их в отношении белого списка Google App Engine здесь, я не уверен, что поддерживается, а что нет.

http://code.google.com/appengine/docs/java/jrewhitelist.html

Материал java.security может быть немного больно работать, иногда вы можете использовать Jasypt - это более упрощенный API, который работает с любым JCE:

http://www.jasypt.org/

Ответ 5

PHP crypt поддерживает несколько хеш-функций. Если вы используете версию MD5 (хеш начинается с $1 $), здесь вы можете найти реализацию Java,

http://www.java2s.com/Open-Source/Java-Document/Groupware/LibreSource/md5/MD5Crypt.java.htm

Обратите внимание, что они используют свой собственный класс MD5. Я не уверен, что он такой же, как стандартный MD5.

Я уверен, что вы также можете найти реализацию Java для других алгоритмов хеширования.

Ответ 6

Ну, скрипт PHP на самом деле не шифрует, насколько я знаю. Я просто полагаю, что если ваш текущий сайт PHP использует криптографию MD5 или SHA256 или что-то еще, я бы ожидал, что вы сможете найти эти эквивалентные хэширующие классы/функции в Java.

Ответ 7

Я могу порекомендовать это: реализация MD5Crypt

MD5Crypt.crypt("youPassword"); // output: $1$zSiw0koU$i3Srfmoxx4VPePJHWqAuK/

Это одна из немногих реализаций, которая работает для меня.