java - IPBoard 密码哈希问题,与算法不匹配

标签 java php mysql jdbc ipb

可以在此处找到 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 函数,而是抓取数据并在 Java 中执行 MD5 检查,以更好地了解发生了什么。

为此,我使用了以下我已经使用了很长时间的 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

生成的服务器是使用其他论坛(包括 IPB)使用的 MD5(MD5(salt) + MD5(rawpassword)) 方法生成的。这在 MyBB 上有效,所以我有点慌张。

我已经检查过诸如大小写问题等问题,但我的结果完全是空白。

最佳答案

您使用的密码或盐似乎有问题。在以下示例中,我使用了盐 363 和密码 password

如果run this code in 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)

您提到了数据库盐,所以也许您使用数据库盐,而实际上每个用户都有自己独特的盐?

关于java - IPBoard 密码哈希问题,与算法不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27993890/

相关文章:

java - 视频连续播放 firebase

java - Activity 泄漏了窗口 com.android.internal.policy.impl.PhoneWindow$DecorView

php - MySQL 存储过程

java - 帮助 java 线程和执行器 : Executing several MySQL selects, 同时插入和更新

mysql - 将 MySQL 数据库打印到文本文件并重新上传的最简单方法

php - 使用PHP继承格式的Mysql数据

java - 如何在bin文件的字节数组[]中搜索字节序列?

java - 数组代码故障排除 - 我的代码有什么问题?

php - Bootstrap 模态背景不覆盖按钮和字段

PHP Array 在同一个键上合并两个数组