当前位置: 首页 > 知识库问答 >
问题:

base64_decode的打印结果会产生意外输出

张毅
2023-03-14

对于一个类,我得到了一个由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);

/*备选方案#1:为散列*/system.out.println生成大量不可打印的字符(用户名+“:”+新字符串(解码(密码))+“:”+salt);

/*备选2:给出散列中每个字节的十进制值列表*/system.out.println(username+“:”+arrays.toString(decode(password))+“:”+salt);

            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个答案

龚寂弦
2023-03-14

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

背景:当一个值被散列时,所有的字节都是根据散列算法改变的,并且产生的字节常常超出可打印字符的范围。Base64编码只是一个字母表,将所有字节映射成可打印的字符。

解决方案:使用Base64 decode返回的字节,而不是尝试将它们变成字符串。将这些原始字节转换为十六进制表示形式(Base16),然后再打印它们或将它们提供给Hashcat或JTR。简而言之,你需要做类似下面这样的事情(碰巧用到了Guava库):

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

这是从我贴出的一个较长的回答中浓缩出来的

 类似资料:
  • 我有一个由两个字段“键控”的记录流,然后分配一个间隔为30秒的会话窗口。我使用附加在记录上的“时间戳”作为事件时间。我正在使用“Assign AscendingTimeStamps”水印。 以下面的记录为例。该流由(用户,place)键控。 Record1:user1,place1,timestamp t1 Record2:user2,place1,timestamp在t1之后30秒 桶1 Rec

  • 我试图调试HALF\u甚至i java的舍入问题,正如您在下面看到的,意外的结果是377.35,我们可以预期它会打印377.34? 有人能解释一下这种行为吗?

  • 我有一个用户表和一个高尔夫比赛分数表。当用户参加比赛时,他使用表格在结果表中记录分数。我想显示一个结果表,显示用户的完整列表和比赛的分数。表中有八列分数——每门课一列。我正在努力使用php代码来显示结果分数。如果一名球员已经比赛,他的得分将正确显示,但如果表中的下一名球员没有比赛,则他的得分将显示为表中高于他的球员的得分。这将在列表中继续下去,直到获得真正的分数。我试图找到答案,但没有成功。这是我

  • 问题内容: 我有一个名为“单词”的列表,其中包含字符串。在这里Log.i可以很好地处理“ word”标签,但不会执行“step”语句。似乎如果条件不能很好地工作。尽管“单词”列表包含类似的字符串,但这种方法永远不会进入它。怎么了 请帮助 问题答案: 您需要使用,不。检查两个Object引用是否引用相同的内容Object: 从部分15.21.3引用相等运算符==和=!在的Java语言规范3.0: 虽