在base64编码时删除结尾的“=”
我注意到,无论何时我base64编码一个string,在末尾附加“=”。 我可以删除这个字符,然后通过加回来可靠地解码它,或者这是危险的吗? 换句话说,“=”是总是附加的,还是只在某些情况下?
我希望我的编码string尽可能短,这就是为什么我想知道是否可以始终删除“=”字符,并在解码之前将其添加回来。
谢谢
=
是填充。
维基百科说
分配一个附加的填充字符,可以用来强制编码的输出为4个字符的整数倍(或者等同于未编码的二进制文本不是3字节的倍数时)。 这些填充字符在解码时必须被丢弃,但仍然允许计算未编码文本的有效长度,当其input二进制长度不是3字节的倍数时(最后一个非填充字符通常被编码,使得最后一个它表示的6位块将在其最低有效位上填零,最多两个填充字符可能出现在编码stream的末尾)。
如果您控制另一端,则可以在传输时将其删除,然后在解码之前重新插入(通过检查string长度)。
请注意,数据在传输过程中将不是有效的Base64。
我写了一部分Apache的commons-codec-1.4.jar Base64解码器,在这个逻辑中,我们没有填充字符。 文件结束和数据stream结束是指示Base64消息完成任何数量的'='字符的指标!
我们在commons-codec-1.4中引入的URL安全变体省略了填充字符,目的是为了保持更小!
我想一个更安全的答案是,“取决于你的解码器的实现”,但从逻辑上说,写一个不需要填充的解码器并不难。
在JavaScript中你可以做这样的事情:
// if this is your Base64 encoded string var str = 'VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA=='; // make URL friendly: str = str.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, ''); // reverse to original encoding if (str.length % 4 != 0) str += ('===').slice(0, 4 - (str.length % 4)); str = str.replace(/-/g, '+').replace(/_/g, '/');
另见这个小提琴: http : //jsfiddle.net/7bjaT/66/
=
添加填充。 base64string的长度应该是4的倍数,所以根据需要添加1或2 =
。
阅读:不,你不应该删除它。
在Android上我使用这个:
全球
String CHARSET_NAME ="UTF-8";
编码
String base64 = new String( Base64.encode(byteArray, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_CLOSE | Base64.NO_WRAP), CHARSET_NAME); return base64.trim();
解码
byte[] bytes = Base64.decode(base64String, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_CLOSE | Base64.NO_WRAP);
在Java上等于这个:
编码
private static String base64UrlEncode(byte[] input) { Base64 encoder = new Base64(true); byte[] encodedBytes = encoder.encode(input); return StringUtils.newStringUtf8(encodedBytes).trim(); }
解码
private static byte[] base64UrlDecode(String input) { byte[] originalValue = StringUtils.getBytesUtf8(input); Base64 decoder = new Base64(true); return decoder.decode(originalValue); }
我从来没有跟踪“=”的问题,我也使用Bouncycastle