0

我正在运行 IBM 教程中的一个示例,该示例有一个简单的示例,可以在给定的纯文本上生成 MAC。代码如下:

public static void main(String[] args) throws Exception {
    //
    // check args and get plaintext
    if (args.length != 1) {
        System.err
                .println("Usage: java MessageAuthenticationCodeExample text");
        System.exit(1);
    }
    byte[] plainText = args[0].getBytes("UTF8");
    //
    // get a key for the HmacMD5 algorithm
    System.out.println("\nStart generating key");
    KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
    SecretKey MD5key = keyGen.generateKey();
    System.out.println("Finish generating key");
    //
    // get a MAC object and update it with the plaintext
    Mac mac = Mac.getInstance("HmacMD5");
    mac.init(MD5key);
    mac.update(plainText);
    //
    // print out the provider used and the MAC
    System.out.println("\n" + mac.getProvider().getInfo());
    System.out.println("\nMAC: ");
    System.out.println(new String(mac.doFinal(), "UTF8"));
}

这一切都很好,但是使用 String arg "This is a test" 运行它,我得到以下输出:

在此处输入图像描述

在实际教程中,MAC 输出的格式更好,例如

 MAC:
Dkdj47x4#.@kd#n8a-x>

,我的意思是我真正认识的字符!

我认为使用“UTF8”参数可以达到这个目的,但我可能弄错了,所以谁能告诉我如何让输出格式像上面那样?

4

1 回答 1

0

MAC 的输出是一个字节数组。它不是 UTF-8 字符序列,您可以以有意义的方式将其转换为字符串。如果你想从中获得一些可读的东西,一些选项是:

  • 十六进制编码
  • base64 编码

出于快速和肮脏示例的目的,您可能可以使用

new String(mac.doFinal(), "ISO-8859-1")

你可能会得到或多或少可读的东西。但是,如果您运气不好,您的 mac 将包含会干扰您的输出的控制字符。

于 2013-09-24T20:39:56.677 回答