2013-09-24 21 views
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")); 
} 

这一切都很好,但与字符串ARG运行它“这是一个测试”我得到以下输出:

enter image description here

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

MAC: 
Dkdj47x4#[email protected]#n8a-x> 

,很好,我指的是我真正认识的角色!

我认为使用“UTF8”参数服务于这个目的,但我可能错了,所以任何人都可以告诉我如何得到输出格式如上?

回答

0

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

  • 十六进制编码
  • base64编码

对于一个快速和肮脏的例子的目的,你很可能

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

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