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"。另外,这里还有几个例子:
- 'echo KQ3h3dENa | base64' => 结果='S1EzaDNkRU5hCg==',但应该是'S1EzaDNkRU5h'
- 回声 KQ3h3dENaa | base64' => result='S1EzaDNkRU5hYQo=',但应该是'S1EzaDNkRU5hYQ=='
填充
'=='序列表示最后一组只包含一个字节,'='表示它包含两个字节。
理论上解码不需要填充字符,因为缺失的字节数可以根据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 编码相同。
我正在尝试在 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'
- 回声 KQ3h3dENaa | base64' => result='S1EzaDNkRU5hYQo=',但应该是'S1EzaDNkRU5hYQ=='
填充
'=='序列表示最后一组只包含一个字节,'='表示它包含两个字节。
理论上解码不需要填充字符,因为缺失的字节数可以根据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 编码相同。