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

时间:2016-06-01 08:50:09

标签: java linux base64

我正在尝试在Linux CentOS上生成一些随机密码,并将其作为base64存储在数据库中。密码为'KQ3h3dEN',当我用'echo KQ3h3dEN |转换它时base64'因此我会得到'S1EzaDNkRU4 K '。 我在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”。此外,还有一些例子:

  • 'echo KQ3h3dENa | base64'=> result ='S1EzaDNkRU5hCg ==',但它应该是'S1EzaDNkRU5h'
  • echo KQ3h3dENaa | base64'=> result ='S1EzaDNkRU5hYQo =',但它应该是'S1EzaDNkRU5hYQ =='

3 个答案:

答案 0 :(得分:3)

经过几个小时的实验后找到解决方案。似乎新行被添加到我想编码的字符串中。解决方案是: echo -n KQ3h3dEN | BASE64

结果与java base64编码相同。

答案 1 :(得分:1)

<强>填充

&#39; ==&#39; sequence表示最后一个组只包含一个字节,&#39; =&#39;表示它包含两个字节。

理论上,解码时不需要填充字符,因为可以从Base64数字的数量计算丢失字节的数量。在一些实现中,填充字符是强制性的,而对于其他实现,则不使用填充字符。

所以它取决于您使用的工具和库。如果带有填充的base64与没有填充的相同,则没有问题。作为一种保险,您可以使用linux工具生成带填充的base64。

答案 2 :(得分:0)

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

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