簡體   English   中英

消息驗證碼輸出的奇數格式

[英]Odd format of Message Authentication Code output

我正在從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”參數可以達到此目的,但我可能弄錯了,所以有人可以告訴我如何將輸出格式化為上述格式嗎?

MAC的輸出是字節數組。 它不是UTF-8字符序列,您可以以有意義的方式將其轉換為字符串。 如果您想從中獲得一些可讀性,則可以選擇以下選項:

  • 十六進制編碼
  • base64編碼

出於一個簡短示例的目的,您可以使用

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

您可能會或多或少地獲得一些可讀性。 但是,如果您不走運,您的Mac將包含控制字符,這些字符會干擾您的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM