Java中的Base64详解
詳解Java中的Base64原理跟用法
簡介
? Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法, 也是MIME(多用途互聯網郵件擴展,主要用作電子郵件標準)中一種可打印字符表示二進制數據的常見編碼方法。它其實只是定義用可打印字符傳輸內容一種方法,并不會產生新的字符集。嚴格來說Base64并不是一種加密/解密算法,而是一種編碼方式。Base64不生成密鑰,通過Base64編碼后的密文就可以直接“翻譯”為明文,但是可以通過向明文中添加混淆字符來達到加密的效果。
Base64實現轉換原理
? 它是用64個可打印字符表示二進制所有數據方法。由于2的6次方等于64,所以可以用每6個位元為一個單元,對應某個可打印字符。我們知道三個字節有24個位元,就可以剛好對應于4個Base64單元,即3個字節需要用4個Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9 ,這樣共有62個字符,此外兩個可打印符號在不同的系統中一般有所不同。但是,我們經常所說的Base64另外2個字符是:“+/”。這64個字符,所對應表如下:
? 轉換的時候,將三個byte的數據,先后放入一個24bit的緩沖區中,先來的byte占高位。數據不足3byte的話,于緩沖區中剩下的bit用0補足。然后,每次取出6個bit,按照其值選擇
**ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/**中的字符作為編碼后的輸出。不斷進行,直到全部輸入數據轉換完成。
如果最后剩下兩個輸入數據,在編碼結果后加1個“=”;如果最后剩下一個輸入數據,編碼結果后加2個“=”;如果沒有剩下任何數據,就什么都不要加,這樣才可以保證資料還原的正確性。
編碼后的數據比原始數據略長,為原來的4/3。無論什么樣的字符都會全部被編碼,因此不像Quoted-printable編碼,還保留部分可打印字符。所以,它的可讀性不如Quoted-printable編碼!
? M的Ascii碼是77,前六位對應值為19,對應base64字符是T,如此類推。其它字符編碼就可以自動轉換得到!我們看看另外不是剛好是3個字節的情況!
代碼示例
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;} }輸出結果
SGVsbG/vvIxXb3JsZCE= HelloWorld代碼示例
package com.test.demo;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;/*** @Description Base64的加密、解密測試* @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;} }輸出結果
5L2g5Lus5aW977yB77yB77yB 你們好!!!sun.misc.BASE64Encoder詳解
(一)、BASE64編碼規則及JAVA中的使用
1、編碼規則:
Base64編碼要求把3個8位字節(3*8=24)轉化為4個6位的字節(4*6=24),之后在6位的前面補兩個0,形成8位一個字節的形式。
例如字符串“張3” :
11010101 11000101 00110011
用十進制表示即為:53 34 20 51
這個并不是最終的結果,還需要根據Base64的編碼表查詢出轉換后值。
下面就是BASE64編碼表:
2、編碼和解碼
在JAVA中要實現Base64的編碼和解碼是非常容易的,因為JDK中已經有提供有現成的類:
編碼:
解碼:
sun.misc.BASE64Decoder dec = newsun.misc.BASE64Decoder(); byte[] data = dec.decodeBuffer(decodeStr);更多知識點參考請點擊這里
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 進行解碼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 進行加密,即對字符串進行三次的BASE64編碼public static String encryption(Object obj){return B64Demo.getBASE64(B64Demo.getBASE64(B64Demo.getBASE64((String)obj)));}// 將 BASE64 編碼的字符串 s 進行解密,即對字符串進行三次的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);}}?
總結
以上是生活随笔為你收集整理的Java中的Base64详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028全球婴儿护理台行业调研
- 下一篇: 单元测试、注解、枚举、反射(5)Java