【问题标题】:MD5 Hash Brute Force javaMD5 哈希蛮力 java
【发布时间】:2016-02-05 17:29:13
【问题描述】:

我在为类分配创建蛮力 Java 代码时遇到了一些麻烦。教授帮不上什么忙,我希望有人能帮我一把或给点建议。教授提供了两种方法md5_bytesmini_md5_bytes。迷你字节用于解码 24 位而不是完整的哈希。我试图自己去做,但我碰壁了。随机字符串生成器是我尝试使用随机字符串最终找到预选单词 s 的哈希值的尝试。我很感激帮助。

public class BruteForce {
static int num_bytes=24;
static String rand = "";
static String s = "aefbcefacefeacaecefc";
static byte[] random = null;
static byte[] md = null;

public static void main(String[] args) throws Exception{
    md = mini_md5_bytes(s, num_bytes);
    if(s.equalsIgnoreCase(rand)){
        System.out.println(rand);
    }
    else{
        rand = brute(md, s);
    }

}




public static byte[] mini_md5_bytes(String s, int num_bytes){

    byte[] md = md5_bytes(s);

    return Arrays.copyOf(md,num_bytes);

}
public static byte[] md5_bytes(String s){

     MessageDigest md;
     try {
         md = MessageDigest.getInstance("MD5");
         md.update(s.getBytes());
         return md.digest();
     } catch( java.security.NoSuchAlgorithmException e) {
         return null;
     }
 }
public static String brute(byte[] md, String s) throws Exception{
    while(!s.equalsIgnoreCase(rand)){
        rand =  RandomStringGenerator.generateRandomString(20,RandomStringGenerator.Mode.ALPHA);
        byte[] random = mini_md5_bytes(rand, num_bytes);
            if((Arrays.equals(random, md))){
                rand = s;
                return rand;
            }               
    }
    return null;

   }


 }

【问题讨论】:

  • 如果你想使用蛮力,最好为所有值编码,而不是使用随机生成器。
  • 你到底有什么问题?代码需要永远运行吗?当然可以——你正在尝试使用随机字符串来暴力破解哈希!
  • 我也不清楚这个问题。它不工作吗?它没有完成吗?你永远不会用随机字符串完成,因为你永远无法知道你在哪里/你去过哪里,而且你最终可能会反复尝试相同的字符串。我建议你建立一个“尝试”列表。
  • 那么一个递增的计数变量?它永远运行我什至尝试限制它使用的字母表。有没有一种方法可以消除随机字符串以使其运行得更快,或者它总是会随机产生一个

标签: md5


【解决方案1】:

虽然 MD5 是 no longer considered safe for crypto,但这并不意味着 MD5 很容易被暴力破解。

正如其他人在 cmets 中所建议的那样,不要尝试随机字符串(尤其是因为随机数的生成速度很慢)。 Brute force 是关于尝试所有组合直到找到匹配项。

此外,通过阅读您的mini_md5_bytes(),您似乎不想找到两个具有完全相同 MD5 哈希的字符串,而只是具有相同的 MD5“前缀”。

如果是这种情况,请为num_bytes 使用一个较小的数字。也许从 1 或 2 开始,然后增加数字,直到您的工具变得太慢。顺便说一句,请注意您使用的是 num_bytes=24,即 192 位,而 MD5 produces just 128 bits

另外,你为什么使用s.equalsIgnoreCase(rand)?如果你想暴力破解一个 MD5 哈希,那么你不应该关心输入字符串s。该字符串甚至不应该是输入!如果s 是一个输入,你可以使用rand = s 就可以了。您的目标是找到哈希冲突,而不是找到原始字符串。

这是brute() 函数的正确签名:

public static String brute(byte[] md) throws Exception

这是while-loop 的正确条件:

while(!Arrays.equals(random, md))

【讨论】:

  • 我将如何尝试所有的组合?我不知道我会怎么做。我会假设某种循环?
  • @user4730535:首先尝试"\x00",然后"\x01",...,然后"\xff",然后"\x00\x00",...
猜你喜欢
  • 2020-06-26
  • 1970-01-01
  • 2020-12-08
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2013-05-21
相关资源
最近更新 更多