MD5 Hash Brute Force java

时间:2016-02-05 17:29:14

标签: md5

我在为类分配创建强力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;

   }


 }

1 个答案:

答案 0 :(得分:1)

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

正如其他人在评论中建议的那样,不要尝试随机字符串(特别是因为随机数的生成很慢)。 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 - 循环的正确条件:

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