base64_encode () из функции php в Java не возвращает те же данные - PullRequest
0 голосов
/ 02 июля 2018

Я работаю над проектом Java, который должен иметь аутентификацию от учетных записей, созданных на локальном веб-сайте. Пароли этих учетных записей шифруются функцией php перед вставкой в ​​базу данных:

public function crypter($mdp){
    $j = 0;
    $tmp = 0;
    $key = $mdp;

    $res = "";

    for($i = 0; $i < strlen($mdp) ; $i++)
    {
        $tmp = ord($mdp[$i]) + ord($key[$i]);
        if($tmp > 255){
            $tmp = $tmp - 256;
        }

        $res[$i] = chr($tmp);

        if($j == strlen($key)-1){
            $j = 0;
        }
        else{
            $j = (($j % (strlen($key))) +1 );
        }
    }

    $res = base64_encode($res);

    return $res;
}

ПРИМЕЧАНИЕ. Эта функция была написана не мной, поэтому, если вы, ребята, выясните, для чего используется переменная $j, дайте мне знать. Я также (очевидно) не могу изменить этот код.

Итак, я попытался перевести эту функцию в Java, которая дала следующее:

public String cryptMdp(String mdp){
    String res = "";
    String key = mdp;

    int j = 0;
    int tmp = 0;

    for (int i = 0; i < mdp.length(); i++) {
        char c = mdp.charAt(i);
        char c2 = key.charAt(i);

        tmp = (int) c + (int) c2;
        if (tmp > 255) {
            tmp = tmp - 256;
        }

        res += (char) tmp;

        if (j == key.length() - 1){
            j = 0;
        }
        else{
            j = (j % key.length()) + 1;
        }
    }
    return Base64.getMimeEncoder().encodeToString(res.getBytes());
}

К сожалению, они не возвращают одну и ту же строку (например, для строки a, php возвращает wg==, а Java возвращает w4I=.), Хотя согласно этот вопрос это должен быть стандартом.

Ребята, вы видите, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я смог сделать то, что хочу, используя URLConnection для отправки HTTP-запроса на мою страницу PHP, например:

public String cryptMdp(String mdp){
    try {
        URL url = new URL("http://myaddress/someproject/create_pwd.php?pwd=" + mdp);
        URLConnection conn = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        String inputline = "";

        while((inputline = in.readLine()) != null){
            return inputline;
        }
        in.close();
    } catch (MalformedURLException ex) {
        System.out.println("error URL");
    } catch (IOException ex) {
        System.out.println("error connection");
    }
    return null;
}

Проблема заключалась в том, что PHP использовал неизвестные символы перед их кодированием, что означает, что все пароли были неправильно зашифрованы ...

РЕДАКТИРОВАТЬ:

На самом деле пароль шифруется по-разному в IDE (NetBeans) и в построенном приложении (.jar), поэтому Base64.getMimeEncoder().encodeToString(res.getBytes()); фактически выдает то же, что и метод PHP ...

0 голосов
/ 02 июля 2018

Используйте существующие функции Java для Base64: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html

Вы, вероятно, ищете этот метод:

кодировать (byte [] src) Кодирует все байты из указанного байтового массива во вновь распределенный байтовый массив с использованием схемы кодирования Base64.

...