在Linux CentOS终端和Java中使用Base64编码会产生不同的结果。

7

我正在尝试在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”,因此更新了问题。此外,以下是几个示例:

  • 'echo KQ3h3dENa | base64' => 结果='S1EzaDNkRU5hCg==',但应该是'S1EzaDNkRU5h'
  • 'echo KQ3h3dENaa | base64' => 结果='S1EzaDNkRU5hYQo=',但应该是'S1EzaDNkRU5hYQ=='
3个回答

15

在尝试几个小时后,我找到了解决方案。似乎字符串中添加了一个新行符。 解决方案是: echo -n KQ3h3dEN | base64

结果与使用Java Base64编码的结果相同。


一个人真的需要知道这个 :) - rocksteady

1

填充

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

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

所以这取决于您使用的工具和库。如果对于它们来说,带填充的base64与不带填充的base64相同,则没有问题。作为保险措施,您可以使用生成带填充的base64的Linux工具。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接