Base64 encode gives different result on linux CentOS terminal and in Java
我正在尝试在Linux CentOS上生成一些随机密码,并将其作为base64存储在数据库中。 密码是" KQ3h3dEN",当我用" echo KQ3h3dEN"转换时| base64"的结果,我将得到" S1EzaDNkRU4K"。
我在Java中有功能:
1 2 3 4 5 6 7 |
并且encode64Base(" KQ3h3dEN")的结果为'S1EzaDNkRU4 ='。
因此,在此示例中,它将添加" K"而不是" ="。 当在Linux上使用base64和在Java中使用base64编码时,如何确保我将始终获得相同的结果?
更新:更新了问题,因为我在Linux编码字符串的末尾没有注意到" K"。 此外,这里还有一些其他示例:
- 'echo KQ3h3dENa | base64'=> result ='S1EzaDNkRU5hCg ==',但应为'S1EzaDNkRU5h'
- 回声KQ3h3dENaa | base64'=> result ='S1EzaDNkRU5hYQo =',但应为'S1EzaDNkRU5hYQ =='
经过几个小时的实验,找到了解决方案。似乎将新行添加到了我要编码的字符串中。解决方案是:
echo -n KQ3h3dEN | base64
结果将与java base64编码相同。
填充
" =="序列指示最后一组仅包含一个字节,而" ="指示其包含两个字节。
从理论上讲,不需要填充字符,因为可以从Base64位数计算出丢失的字节数。在某些实现中,填充字符是强制性的,而对于其他实现则不使用。
因此,这取决于您使用的工具和库。如果具有填充的base64与没有填充的base64相同,则没有问题。作为保险,您可以在使用padding生成base64的linux工具上使用。
使用Base64.Encoder类的WithoutPadding()获取Base64.Encoder实例,该实例进行编码而无需在末尾添加任何填充字符。
检查链接:
https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html#withoutPadding