base64_decode的打印结果给出了意想不到的输出

时间:2013-12-03 21:50:46

标签: java hash decoding

对于一个类,我得到了一个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的格式返回并打印密码的原始哈希值?

1 个答案:

答案 0 :(得分:0)

问题:您正在尝试使用Base64编码的密码哈希值,当它们被解码时,有不可打印的字符

背景:对值进行哈希处理时,字节全部根据哈希算法进行更改,结果字节通常超出可打印字符的范围。 Base64编码只是一个将所有字节映射为可打印字符的字母。

解决方案:使用Base64 decode返回的字节,而不是尝试将它们变成String。在打印它们之前将这些原始字节转换为十六进制表示(Base16)或将它们提供给Hashcat或JTR。简而言之,您需要执行以下操作(碰巧使用Guava库):

String hex = BaseEncoding.base16().encode(bytesFromEncodedString);

这是从a longer answer I posted

精简而来的