Base64 编码在 linux CentOS 终端和 Java 中给出不同的结果

Base64 encode gives different result on linux CentOS terminal and in Java

我正在尝试在 Linux CentOS 上生成一些随机密码并将其作为 base64 存储在数据库中。密码是 'KQ3h3dEN',当我用 'echo KQ3h3dEN | base64' 转换它时,我会得到 'S1EzaDNkRU4K'。 我在 java 中有功能:

public static String encode64Base(String stringToEncode)
{
    byte[] encodedBytes = Base64.getEncoder().encode(stringToEncode.getBytes());
    String encodedString = new String(encodedBytes, "UTF-8");

    return encodedString;
}

encode64Base("KQ3h3dEN") 的结果是 'S1EzaDNkRU4='。

所以,在这个例子中它添加了 "K" 而不是“=”。如何确保在 linux 上使用 base64 和在 java 上使用 base64 编码时总是得到相同的结果?

更新:更新了问题,因为我没有注意到 linux 编码字符串末尾的 "K"。另外,这里还有几个例子:

填充

'=='序列表示最后一组只包含一个字节,'='表示它包含两个字节。

理论上解码不需要填充字符,因为缺失的字节数可以根据Base64位数来计算。在某些实现中,填充字符是强制性的,而对于其他实现则不使用。

所以这取决于您使用的工具和库。如果带填充的base64与不带填充的一样,就没有问题。作为保险,您可以使用 linux 生成带填充的 base64 的工具。

使用 Base64.Encoder class 的 withoutPadding() 来获取 Base64.Encoder 实例,该实例编码时不在末尾添加任何填充字符。

检查 link : https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html#withoutPadding

经过几个小时的试验找到了解决方案。似乎新行已添加到我要编码的字符串中。解决方案是: 回声-n KQ3h3dEN | base64

结果将与 java base64 编码相同。