我正在为学校做一个关于安全和如何使用字典破解密码的作业。我们得到了六个散列密码、一个单词字典和一个salt散列值。其中三个密码没有加盐,我已经破解了。我找不到这三个加了盐的密码。
我将代码设置为遍历大型字典,对每个单词进行散列,然后与散列后的密码进行比较。我已经尝试将Salt值散列到我散列的每个单词的前面和/或后面,以进行比较,但我找不到任何匹配。我们使用三种不同的算法(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十六进制。这将返回散列到for循环之后的值,该循环正在我的字典中查找匹配项。我不明白为什么它可以找到三个无盐版本,但将盐添加到前面(或后面)将不起作用。显然,我在这里误解了一些东西。任何清晰度都是非常感谢的。谢谢!
发布于 2018-01-13 05:40:42
尝试如下所示:
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);
}https://stackoverflow.com/questions/48234024
复制相似问题