我正在尝试在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”。此外,还有一些例子:
答案 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