Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 消息身份验证代码输出的奇数格式_Java_Security_Utf 8_Format - Fatal编程技术网

Java 消息身份验证代码输出的奇数格式

Java 消息身份验证代码输出的奇数格式,java,security,utf-8,format,Java,Security,Utf 8,Format,我正在运行IBM教程中的一个示例,其中有一个简单的示例,可以在给定的纯文本上生成MAC。代码如下: public static void main(String[] args) throws Exception { // // check args and get plaintext if (args.length != 1) { System.err .println("Usage: java MessageAuthent

我正在运行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"));
}
这很好,但是使用字符串arg“thisatest”运行它时,我会得到以下输出:

在实际的教程中,MAC输出的格式要精确得多,例如:

 MAC:
Dkdj47x4#.@kd#n8a-x>
,我所说的“好”是指我真正认识的角色


我认为使用“UTF8”参数可以达到这个目的,但我可能弄错了,所以有人能告诉我如何将输出设置为上述格式吗?

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

  • 十六进制编码
  • base64编码
对于一个快速而肮脏的示例,您可能会使用

new String(mac.doFinal(), "ISO-8859-1")
你可能会得到一些或多或少可读的东西。但是,如果您运气不好,您的mac将包含会干扰输出的控制字符