gpt4 book ai didi

java - 使用字典和散列破解密码

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:29 25 4
gpt4 key购买 nike

我正在为学校做一项有关安全以及如何使用字典破解密码的作业。我们提供了六个散列密码、一本单词字典和一个盐散列值。其中三个密码没有加盐,我已经破解了。我找不到这三个加盐密码。

我的代码设置为迭代大字典并对每个单词进行哈希处理,然后与哈希密码进行比较。我尝试将盐值散列到我正在散列进行比较的每个单词的前面和/或后面,但我找不到任何匹配项。我们使用三种不同的算法(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”是字符串中的盐十六进制。这将散列后的值返回到 for 循环,该循环在我的字典中运行以查找匹配项。我不明白为什么它可以找到三个未加盐的版本,但在前面(或后面)添加盐是行不通的。显然我在这里误解了一些东西。非常感谢任何清晰度。谢谢!

最佳答案

尝试这样的事情:

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);
}

关于java - 使用字典和散列破解密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48234024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com