Java中的Base64详解
詳解Java中的Base64原理跟用法
簡(jiǎn)介
? Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。它通常用作存儲(chǔ)、傳輸一些二進(jìn)制數(shù)據(jù)編碼方法, 也是MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展,主要用作電子郵件標(biāo)準(zhǔn))中一種可打印字符表示二進(jìn)制數(shù)據(jù)的常見編碼方法。它其實(shí)只是定義用可打印字符傳輸內(nèi)容一種方法,并不會(huì)產(chǎn)生新的字符集。嚴(yán)格來說Base64并不是一種加密/解密算法,而是一種編碼方式。Base64不生成密鑰,通過Base64編碼后的密文就可以直接“翻譯”為明文,但是可以通過向明文中添加混淆字符來達(dá)到加密的效果。
Base64實(shí)現(xiàn)轉(zhuǎn)換原理
? 它是用64個(gè)可打印字符表示二進(jìn)制所有數(shù)據(jù)方法。由于2的6次方等于64,所以可以用每6個(gè)位元為一個(gè)單元,對(duì)應(yīng)某個(gè)可打印字符。我們知道三個(gè)字節(jié)有24個(gè)位元,就可以剛好對(duì)應(yīng)于4個(gè)Base64單元,即3個(gè)字節(jié)需要用4個(gè)Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9 ,這樣共有62個(gè)字符,此外兩個(gè)可打印符號(hào)在不同的系統(tǒng)中一般有所不同。但是,我們經(jīng)常所說的Base64另外2個(gè)字符是:“+/”。這64個(gè)字符,所對(duì)應(yīng)表如下:
? 轉(zhuǎn)換的時(shí)候,將三個(gè)byte的數(shù)據(jù),先后放入一個(gè)24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后,每次取出6個(gè)bit,按照其值選擇
**ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/**中的字符作為編碼后的輸出。不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。
如果最后剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=”;如果最后剩下一個(gè)輸入數(shù)據(jù),編碼結(jié)果后加2個(gè)“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。
編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng),為原來的4/3。無論什么樣的字符都會(huì)全部被編碼,因此不像Quoted-printable編碼,還保留部分可打印字符。所以,它的可讀性不如Quoted-printable編碼!
? M的Ascii碼是77,前六位對(duì)應(yīng)值為19,對(duì)應(yīng)base64字符是T,如此類推。其它字符編碼就可以自動(dòng)轉(zhuǎn)換得到!我們看看另外不是剛好是3個(gè)字節(jié)的情況!
代碼示例
import java.io.UnsupportedEncodingException;/*** @Description 演示Base64的加密、解密* @author ShengLiu* @date 2018/6/20*/ public class Base64Demo {public static void main(String[] args) {//加密System.out.println(Base64Demo.getBase64Encode("Hello,World!"));//解密System.out.println(Base64Demo.getBase64Decode("SGVsbG9Xb3JsZA=="));}public static String getBase64Encode(String str) {if (str == null || "".equals(str)) {return "";}try {byte[] bt = str.getBytes("UTF-8");str = String.valueOf(Base64.encode(bt));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;}public static String getBase64Decode(String str) {if (str == null || "".equals(str)) {return "";}char[] ch = str.toCharArray();byte[] bt = Base64.decode(String.valueOf(ch));try {str = new String(bt,"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;} }輸出結(jié)果
SGVsbG/vvIxXb3JsZCE= HelloWorld代碼示例
package com.test.demo;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;/*** @Description Base64的加密、解密測(cè)試* @author ShengLiu* @date 2018/6/20*/ public class Base64 {public static void main(String[] args) {System.out.println(Base64.getBase64Encode("你們好!!!"));System.out.println(Base64.getBase64Decode("5L2g5Lus5aW977yB77yB77yB"));}// 加密public static String getBase64Encode(String str) {byte[] b = null;String s = null;try {b = str.getBytes("utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}if (b != null) {s = new BASE64Encoder().encode(b);}return s;}// 解密public static String getBase64Decode(String s) {byte[] b = null;String result = null;if (s != null) {BASE64Decoder decoder = new BASE64Decoder();try {b = decoder.decodeBuffer(s);result = new String(b, "utf-8");} catch (Exception e) {e.printStackTrace();}}return result;} }輸出結(jié)果
5L2g5Lus5aW977yB77yB77yB 你們好!!!sun.misc.BASE64Encoder詳解
(一)、BASE64編碼規(guī)則及JAVA中的使用
1、編碼規(guī)則:
Base64編碼要求把3個(gè)8位字節(jié)(3*8=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(4*6=24),之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。
例如字符串“張3” :
11010101 11000101 00110011
用十進(jìn)制表示即為:53 34 20 51
這個(gè)并不是最終的結(jié)果,還需要根據(jù)Base64的編碼表查詢出轉(zhuǎn)換后值。
下面就是BASE64編碼表:
2、編碼和解碼
在JAVA中要實(shí)現(xiàn)Base64的編碼和解碼是非常容易的,因?yàn)镴DK中已經(jīng)有提供有現(xiàn)成的類:
編碼:
解碼:
sun.misc.BASE64Decoder dec = newsun.misc.BASE64Decoder(); byte[] data = dec.decodeBuffer(decodeStr);更多知識(shí)點(diǎn)參考請(qǐng)點(diǎn)擊這里
filename = "=?UTF-8?B?"+new BASE64Encoder().encoder(filename.getBytes("utf-8"))+"?=";BASE64Encoder 加密和解密
public class B64Demo {public static String getBASE64(String s) { if (s == null) return null; return (new sun.misc.BASE64Encoder()).encode(s.getBytes()); } // 將 BASE64 編碼的字符串 s 進(jìn)行解碼public static String getFromBASE64(String s) { if (s == null) return null; sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); try { byte[] b = decoder.decodeBuffer(s); return new String(b); } catch (Exception e) { return null; } } // 將 BASE64 編碼的字符串 s 進(jìn)行加密,即對(duì)字符串進(jìn)行三次的BASE64編碼public static String encryption(Object obj){return B64Demo.getBASE64(B64Demo.getBASE64(B64Demo.getBASE64((String)obj)));}// 將 BASE64 編碼的字符串 s 進(jìn)行解密,即對(duì)字符串進(jìn)行三次的BASE64解碼public static String decryption(String 3b64){return B64Demo.getFromBASE64(B64Demo.getFromBASE64(B64Demo.getFromBASE64(3b64)));}public static void main(String[] args) {String a = encryption("100000.89".toString());System.out.println(a);//加密System.out.println(decryption(a));//解密} }一、jdk1.8下的 BASE64Encoder 和 BASE64Decoder(JDK9開始已移除):
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;public class test {public static void main(String[] args) throws Exception {String str = "hello word";BASE64Encoder base64Encoder = new BASE64Encoder();// JDK1.8 BASE64Encoder 加密String encode = base64Encoder.encode(str.getBytes());System.out.println(encode);BASE64Decoder base64Decoder = new BASE64Decoder();// JDK1.8 BASE64Decoder 解密byte[] bytes = base64Decoder.decodeBuffer(encode);String res = new String(bytes);System.out.println(res);} }二、推薦使用Base64:
package com.lmp.utils;import java.util.Base64;public class test {public static void main(String[] args) throws Exception {String str = "hello word";// JDK1.8 Base64加密String encode = Base64.getEncoder().encodeToString(str.getBytes());System.out.println(encode);// JDK1.8 Base64解密byte[] bytes = Base64.getDecoder().decode(encode);String res = new String(bytes);System.out.println(res);}}?
總結(jié)
以上是生活随笔為你收集整理的Java中的Base64详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028全球婴儿护理台行业调研
- 下一篇: 单元测试、注解、枚举、反射(5)Java