Эквивалент PHP-функции крипты в Java - PullRequest
13 голосов
/ 20 июля 2010

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

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

$ password = "test123";
$ pwd = crypt ($ пароль, $ пароль);
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();
            }

Ответы [ 7 ]

11 голосов
/ 14 февраля 2013

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

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

UnixCrypt.crypt(string, salt)

OR

Md5Crypt.md5Crypt(byte[], salt)

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

5 голосов
/ 20 июля 2010

Вы должны знать, какая реализация PHP crypt была использована (MD5? SHA256? SHA 512?), Потому что есть несколько, в зависимости от вашей ОС: 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());
2 голосов
/ 20 июля 2010

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

1 голос
/ 20 июля 2010

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

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

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

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

1 голос
/ 20 июля 2010

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

0 голосов
/ 07 мая 2014

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

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

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

0 голосов
/ 20 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...