对于一个类,我得到了一个base64编码的salted sha-256散列密码的文件。
文件格式为:
用户名:base64编码sha256密码:salt
我最初的想法是base64解码哈希,所以我会留下:
用户名:salted哈希密码:salt
然后通过JTR或hashcat运行它来破解密码。
我的问题在于base64解码过程。
我的代码如下:
public static byte[] decode(String string) {
try {
return new BASE64Decoder().decodeBuffer(string);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void splitLine(String strLine)
throws Exception {
StringTokenizer st = new StringTokenizer(strLine, ":");
if (st.hasMoreTokens())
userName = st.nextToken();
if (st.hasMoreTokens())
password = st.nextToken();
if (st.hasMoreTokens())
salt = st.nextToken();
}
public static void main(String[] argv) {
String line = null;
String pwdFile = null;
int count = 0;
try {
pwdFile = argv[0];
BufferedReader br = new BufferedReader(new FileReader(pwdFile));
line = br.readLine();
while (line != null) {
splitLine(line);
/ * alternative#1:为哈希生成很多不可打印的字符* / System.out.println(userName +“:”+ new String(decode(password))+“:”+ salt);
/ * alternative#2:给出散列的每个字节的十进制值列表* / 的System.out.println(用户名+ “:” + Arrays.toString(解码(密码))+ “:” +盐);
count++;
line = br.readLine();
}
br.close();
System.err.println("total lines read: " + count);
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
使用替代#1,我的输出文件中的行数最多比输入文件中多50,000行,所以我假设一些已解码的字符串包含我需要修复的换行符。
如何以hashcat或JTR识别为salted sha256的格式返回并打印密码的原始哈希值?
答案 0 :(得分:0)
问题:您正在尝试使用Base64编码的密码哈希值,当它们被解码时,有不可打印的字符
背景:对值进行哈希处理时,字节全部根据哈希算法进行更改,结果字节通常超出可打印字符的范围。 Base64编码只是一个将所有字节映射为可打印字符的字母。
解决方案:使用Base64 decode返回的字节,而不是尝试将它们变成String。在打印它们之前将这些原始字节转换为十六进制表示(Base16)或将它们提供给Hashcat或JTR。简而言之,您需要执行以下操作(碰巧使用Guava库):
String hex = BaseEncoding.base16().encode(bytesFromEncodedString);
精简而来的