使用字典和散列进行密码破解

时间:2018-01-12 21:09:05

标签: java

我正在为学校安排有关安全性以及如何使用字典破解密码的工作。我们提供了六个哈希密码,一个单词字典和一个盐哈希值。其中三个密码没有腌制,我已经破解了。我无法找到三个盐渍密码。

我的代码设置为遍历大字典并散列每个单词,然后与散列密码进行比较。我试图将盐值哈希到我正在哈希的每个单词的前面和/或后面进行比较,但我找不到任何匹配。我们使用三种不同的算法(MD-5,SHA-256和SHA-1)。我的程序检查密码哈希的长度,并将其路由到需要用于破解的算法。

以下是我为盐渍MD-5密码运行的示例:

MessageDigest md = MessageDigest.getInstance("MD5");
           md.update((word + salt).getBytes());
        byte[] bytes = md.digest();
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < bytes.length; i++) {
            sb.append(Integer.toString((bytes[i] & 0xff) 
+ 0x100, 16).substring(1));
        }       

        return sb.toString();

“word”是要检查的密码,“salt”是字符串中的salt hex。这会将散列后的值返回到通过我的字典查找匹配的for循环。我无法理解为什么它可以找到三个无盐版本,但将盐添加到前面(或后面)不会工作。显然我在这里误解了一些东西。非常感谢任何清晰度。谢谢!

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

MessageDigest md5 = MessageDigest.getInstance("MD5");
Base64.Encoder base64 = Base64.getEncoder();

ShadowRecord r = new ShadoRecord("username", "usedSalt", "hashedPassword");
if (test(r, "secret")) {
    System.out.println("Password is 'secret'");
}

public class ShadowRecord {
    public final String username;
    public final String salt;
    public final String hash; // result of hash(password + salt)

    public ShadowRecord(String username, String salt, String hash) {
        this.username = username;
        this.salt = salt;
        this.hash = hash;
    }
}

public boolean test(ShadowRecord r, String pwd) {
    String input = pwd + r.salt;
    String result = hash(input);
    return result.equals(r.hash);
}

// input = pwd + salt
public String hash(String input) {
    byte[] result =  md5.digest(pwd.getBytes(StandardCharsets.UTF_8));
    byte[] hash = base64.encode(result);
    return new String(hash, StandardCharsets.UTF_8);
}