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

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

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

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

Вывод: (В 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(); } 

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

Класс эквивалентности Java – 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()); 

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

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

 UnixCrypt.crypt(string, salt) 

ИЛИ

 Md5Crypt.md5Crypt(byte[], salt) 

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

  • org.apache.commons.codec.digest.UnixCrypt
  • org.apache.commons.codec.digest.Md5Crypt

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

Вам нужно взглянуть на классы 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/

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

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

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

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

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

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

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

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