Base64最早應(yīng)用于解決電子郵件傳輸?shù)膯栴}。在早期,由于“歷史問題”,電子郵件只允許ASCII碼字符。如果要傳輸一封帶有非ASCII碼字符的電子郵件(例如附件),當(dāng)它通過有“歷史問題”的網(wǎng)關(guān)時(shí)就可能出現(xiàn)問題(網(wǎng)關(guān)可能會(huì)對(duì)非ASCII碼字符的二進(jìn)制位作調(diào)整,即將非ASCII碼的8位二進(jìn)制碼最高位置為0)。此時(shí)用戶收到的郵件會(huì)是一封純粹的亂碼郵件,由于這個(gè)原因產(chǎn)生了base64算法。Base64是一種編碼方式,而不是一種加密方式
電子郵件的附件一般也作Base64編碼的,因?yàn)橐粋€(gè)附件數(shù)據(jù)往往是有不可見字符的。
對(duì)證書來說,特別是根證書,一般都是作Base64編碼的,因?yàn)樗诰W(wǎng)上被許多人下載。
Base64是一種任意二進(jìn)制到文本字符串的編碼方法(二進(jìn)制=》ASCII),Base64適用于小段內(nèi)容的編碼,常用于在URL、Cookie、網(wǎng)頁中傳輸少量二進(jìn)制數(shù)據(jù)、數(shù)字證書簽名、密鑰。
“123456”對(duì)應(yīng)的二進(jìn)制位 00110001 00110010 00110011 00110100 00110101 00110110, 我們?nèi)?個(gè)比特為一組結(jié)果為
對(duì)應(yīng)的base64為:MTIzNDU2
由于標(biāo)準(zhǔn)的Base64編碼后可能出現(xiàn)字符+和/,在URL中就不能直接作為參數(shù),所以又有一種”url safe”的base64編碼,其實(shí)就是把字符+和/分別變成-和_:
由于=字符也可能出現(xiàn)在Base64編碼中,但=用在URL、Cookie里面會(huì)造成歧義,所以,很多Base64編碼后會(huì)把=去掉或者替換成.
public class Base64Util { public static String encode(String src){ BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(src.getBytes()); return encode; } public static String decode(String encode) throws Exception { BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer(encode); return new String(bytes); } /** * 將base64種的敏感字符+,/,=轉(zhuǎn)化為_,-,. 以及base64會(huì)在編碼串中產(chǎn)生換行符 * @param source * @return */ public static String urlSafeEncode(byte[] source) { BASE64Encoder encoder = new BASE64Encoder(); String str = encoder.encode(source); str = str.replaceAll('\\+', '_'); str = str.replaceAll('/', '-'); str = str.replaceAll('=', '.'); str = str.replaceAll('\\s', ''); return str; } /** * urlSafeEncode逆過程 * @param str * @return * @throws IOException */ public static byte[] urlSafeDecode(String str) throws IOException { if (str == null) { return null; } str = str.replaceAll('_', '+'); str = str.replaceAll('-', '/'); str = str.replaceAll('\\.', '='); BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer(str); return bytes; } public static void main(String[] args) throws Exception{ String encode = Base64Util.encode('123456'); String decode = Base64Util.decode(encode); System.out.println(encode); System.out.println(decode); }}
聯(lián)系客服