java — проблема хеширования пароля IPBoard, не соответствует алгоритму

Быстрая ссылка на страницу IPBoard, объясняющая, что форум использует стандартные md5(md5($salt).md5($password)) Формат, используемый большинством форумов, можно найти здесь: https://www.invisionpower.com/support/guides/_/advanced-and-developers/miscellaneous/passwords-in-ipboard-r130

Я на самом деле пришел от использования MyBB, который использует ту же структуру, поэтому я подумал бы, что просто изменение имен таблиц / столбцов в моем запросе приведет к относительно простому переключению, но я ошибся.

Исходный запрос, который я использовал, был следующий

SELECT * FROM `forum_members` WHERE `name`=? AND `members_pass_hash`= MD5(CONCAT(MD5(members_pass_salt), MD5(?)))"

Это подготовленное утверждение, в котором имя пользователя и необработанный пароль предоставлены моим сервером. К сожалению, это не сработало, я сделал несколько шагов и начал отлаживать данные, вместо использования функции SQL MD5, я взял данные и выполнил проверки MD5 в Java, чтобы лучше понять, что происходит.

Для этого я использовал следующую функцию MD5, которую использовал долгое время:

public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}

Это дало несколько странные результаты, в которых данные не совпадали.

Database salt: *nzFC
Database hash: 6bac5cba673134ea084e481b57921134
Server generated hash: d7f94e3f262e7dee81b12ac087c42b18

Сгенерированный сервер был создан с использованием MD5(MD5(salt) + MD5(rawpassword)) метод, используемый другими форумами, включая IPB. Это сработало на MyBB, поэтому я немного растерялся.

Я проверил такие вещи, как проблемы с капитализацией и т. Д., Но я выхожу абсолютно пустым.

0

Решение

Там может быть что-то не так с паролем или солью, которую вы используете. В следующих примерах я использовал соль 363 и пароль password,

Если запустить этот код на Java:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
String salt = "363";
String password = "password";
String md5 = MD5(MD5(salt) + MD5(password));

System.out.println("MD5: " + md5);
}

public static String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
}

Я получил:

MD5: 81a40e9a2b5b97d2ecc28c26cd2d62f4

Если я выполню это в MySQL, я получу тот же хеш MD5:

> SELECT MD5(CONCAT(MD5('363'),MD5('password')));
+-----------------------------------------+
| MD5(CONCAT(MD5('363'),MD5('password'))) |
+-----------------------------------------+
| 81a40e9a2b5b97d2ecc28c26cd2d62f4        |
+-----------------------------------------+
1 row in set (0.00 sec)

У тебя есть Database salt Как уже упоминалось, может быть, вы используете соль базы данных, когда на самом деле у каждого пользователя есть своя уникальная соль?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]