我使用 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
答案 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]
注意字节数组的值相同。