Apache编解码器base64编码/解码 - 没有得到预期的结果

时间:2014-11-07 12:52:37

标签: java apache encoding base64

我使用 apache codec base64 库进行了POC,我使用SHA加密了一个字符串。 (这可以忽略)。

步骤1 - 我为该字符串打印了字节数组。

步骤2 - 对字节数组进行编码并打印其值。

步骤3 - 解码编码值并打印出来。

public static void main(String[] args)
{
    MessageDigest messageDigest = null;
    String ALGORITHM = "SHA";
    try
    {
        messageDigest = MessageDigest.getInstance(ALGORITHM);

        byte[] arr = "admin1!".getBytes();
        byte[] arr2 = messageDigest.digest(arr);

        System.out.println(arr2);
        String encoded = Base64.encodeBase64String(arr2);

        System.out.println(encoded);
        byte[] decoded = Base64.decodeBase64(encoded);

        System.out.println(decoded);
    }
    catch (NoSuchAlgorithmException e)
    {
        e.printStackTrace();
    }
}

预期结果:步骤1和步骤3应产生相同的输出。但我没有得到它。

输出:

  

[B @ 5ca801b0

     

90HMfRqqpfwRJge0anZat98BTdI =

     

[B @ 68d448a1

1 个答案:

答案 0 :(得分:1)

你的节目一切都很好。只是一个错误。

System.out.println(byteArray);打印字节数组对象的hashCode。 (注意:数组是Java中的对象而不是基本类型)

您应该使用System.out.println(Arrays.toString(byteArray));代替,并且您将获得步骤1和3的相同值。

根据javadocs Arrays.toString(byte[] a)返回指定数组内容的字符串表示。

更改后的代码将是:

public static void main(String[] args)
{
MessageDigest messageDigest = null;
String ALGORITHM = "SHA";
try
    {
    messageDigest = MessageDigest.getInstance(ALGORITHM);

    byte[] arr = "admin1!".getBytes();
    byte[] arr2 = messageDigest.digest(arr);

    System.out.println(Arrays.toString(arr2));
    String encoded = Base64.encodeBase64String(arr2);

    System.out.println(encoded);
    byte[] decoded = Base64.decodeBase64(encoded);

    System.out.println(Arrays.toString(decoded));
    }
    catch (NoSuchAlgorithmException e)
    {
    e.printStackTrace();
    }
}

并输出:

  

[ - 9,65,-52,125,26,-86,-91,-4,17,38,7,-76,106,118,90,-73,-33,1,77, -46]

     

90HMfRqqpfwRJge0anZat98BTdI =

     

[ - 9,65,-52,125,26,-86,-91,-4,17,38,7,-76,106,118,90,-73,-33,1,77, -46]

注意字节数组的值相同。