java中BASE64加密/解密詳解(附帶源碼)
1. 項(xiàng)目背景與介紹
在日常開發(fā)中,Base64 編碼是一種常見的數(shù)據(jù)處理方式,廣泛應(yīng)用于以下場(chǎng)景:
- 數(shù)據(jù)傳輸:將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為 ASCII 字符串,方便在文本協(xié)議(如 JSON、XML)中傳輸。
- 數(shù)據(jù)存儲(chǔ):避免特殊字符導(dǎo)致的數(shù)據(jù)解析錯(cuò)誤,例如在 URL 或 Cookie 中存儲(chǔ)二進(jìn)制數(shù)據(jù)。
- 加密輔助:用于編碼密鑰、證書、公私鑰等,但 Base64 本身并不是加密算法,它只是編碼方式。
本項(xiàng)目將展示如何使用 Java 內(nèi)置的 Base64 類進(jìn)行 Base64 編碼(加密)和解碼(解密)。
2. 相關(guān)知識(shí)
2.1 Base64 簡(jiǎn)介
Base64 是一種基于 64 個(gè)可打印字符的編碼方式,它可以將 任意二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為 ASCII 字符串,避免在傳輸或存儲(chǔ)時(shí)出現(xiàn)編碼問題。
Base64 采用的 64 個(gè)字符如下(大小寫字母 + 數(shù)字 + 兩個(gè)符號(hào)):
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
+/
此外,Base64 可能會(huì)在末尾填充 = 號(hào),使其長(zhǎng)度為 4 的倍數(shù)。
2.2 Java Base64 類
從 Java 8 開始,java.util.Base64 提供了三種 Base64 編碼器:
| 編碼器 | 說明 |
|---|---|
Base64.getEncoder() | 標(biāo)準(zhǔn) Base64 編碼 |
Base64.getUrlEncoder() | URL 安全的 Base64 編碼(+ 替換為 -,/ 替換為 _) |
Base64.getMimeEncoder() | MIME 編碼(每 76 個(gè)字符換行) |
相應(yīng)地,解碼器 Base64.getDecoder() 可以將 Base64 字符串轉(zhuǎn)換回原始數(shù)據(jù)。
3. 項(xiàng)目實(shí)現(xiàn)思路
- 編碼(加密):
- 通過
Base64.getEncoder().encodeToString(byte[])方法,將字符串轉(zhuǎn)換為 Base64 編碼格式。
- 通過
- 解碼(解密):
- 通過
Base64.getDecoder().decode(String)方法,將 Base64 編碼的數(shù)據(jù)轉(zhuǎn)換回原始字符串。
- 通過
- 實(shí)現(xiàn)不同 Base64 變體:
- 標(biāo)準(zhǔn) Base64:用于常規(guī)數(shù)據(jù)編碼。
- URL Base64:適用于 URL 傳輸,避免
+和/影響 URL 解析。 - MIME Base64:適用于電子郵件或其他需要換行的場(chǎng)景。
4. 完整代碼實(shí)現(xiàn)
以下 Java 代碼實(shí)現(xiàn)了 Base64 編碼和解碼功能,支持三種模式(標(biāo)準(zhǔn)、URL 安全、MIME)。
import java.util.Base64;
/**
* Base64EncoderDecoder 類用于演示 Java 8 提供的 Base64 編碼和解碼功能。
* 該類支持三種編碼模式:標(biāo)準(zhǔn) Base64、URL 安全 Base64、MIME Base64。
*/
public class Base64EncoderDecoder {
/**
* 使用標(biāo)準(zhǔn) Base64 編碼字符串
*
* @param input 原始字符串
* @return Base64 編碼后的字符串
*/
public static String encodeBase64(String input) {
return Base64.getEncoder().encodeToString(input.getBytes());
}
/**
* 使用標(biāo)準(zhǔn) Base64 解碼字符串
*
* @param base64Str Base64 編碼的字符串
* @return 解碼后的原始字符串
*/
public static String decodeBase64(String base64Str) {
byte[] decodedBytes = Base64.getDecoder().decode(base64Str);
return new String(decodedBytes);
}
/**
* 使用 URL 安全的 Base64 編碼字符串
*
* @param input 原始字符串
* @return URL 安全的 Base64 編碼字符串
*/
public static String encodeBase64Url(String input) {
return Base64.getUrlEncoder().encodeToString(input.getBytes());
}
/**
* 使用 URL 安全的 Base64 解碼字符串
*
* @param base64UrlStr URL 安全的 Base64 編碼字符串
* @return 解碼后的原始字符串
*/
public static String decodeBase64Url(String base64UrlStr) {
byte[] decodedBytes = Base64.getUrlDecoder().decode(base64UrlStr);
return new String(decodedBytes);
}
/**
* 使用 MIME Base64 編碼字符串(適用于郵件和換行文本)
*
* @param input 原始字符串
* @return MIME Base64 編碼的字符串
*/
public static String encodeBase64Mime(String input) {
return Base64.getMimeEncoder().encodeToString(input.getBytes());
}
/**
* 主方法,測(cè)試 Base64 編碼與解碼
*
* @param args 命令行參數(shù)
*/
public static void main(String[] args) {
String originalString = "Hello, Base64!";
// 標(biāo)準(zhǔn) Base64 編碼/解碼
String encoded = encodeBase64(originalString);
String decoded = decodeBase64(encoded);
System.out.println("原始字符串: " + originalString);
System.out.println("Base64 編碼: " + encoded);
System.out.println("Base64 解碼: " + decoded);
// URL Base64 編碼/解碼
String urlEncoded = encodeBase64Url(originalString);
String urlDecoded = decodeBase64Url(urlEncoded);
System.out.println("\nURL 安全 Base64 編碼: " + urlEncoded);
System.out.println("URL 安全 Base64 解碼: " + urlDecoded);
// MIME Base64 編碼(用于郵件等換行文本)
String mimeEncoded = encodeBase64Mime(originalString);
System.out.println("\nMIME Base64 編碼: " + mimeEncoded);
}
}
5. 代碼解讀
5.1 標(biāo)準(zhǔn) Base64 編碼
- 使用
Base64.getEncoder().encodeToString(byte[])將字符串轉(zhuǎn)換為 Base64 編碼格式。 - 解碼時(shí)使用
Base64.getDecoder().decode(String),轉(zhuǎn)換回原始字符串。
5.2 URL 安全 Base64 編碼
Base64.getUrlEncoder()生成的 Base64 字符串避免了+和/,適用于 URL 傳輸。Base64.getUrlDecoder()進(jìn)行解碼。
5.3 MIME Base64 編碼
Base64.getMimeEncoder()適用于需要換行的場(chǎng)景(如電子郵件、長(zhǎng)文本)。- 由于
MIME形式的 Base64 可能包含換行符,解碼時(shí)需注意處理換行問題。
6. 項(xiàng)目總結(jié)與擴(kuò)展
6.1 本項(xiàng)目的收獲
- 掌握 Base64 基本原理:理解 Base64 如何轉(zhuǎn)換二進(jìn)制數(shù)據(jù)為可打印字符,及其應(yīng)用場(chǎng)景。
- 熟悉 Java Base64 API:學(xué)會(huì)使用
Base64類進(jìn)行標(biāo)準(zhǔn)、URL 安全和 MIME 編碼/解碼。 - 區(qū)分編碼與加密:Base64 只是編碼方式,不具備加密能力,應(yīng)與加密算法結(jié)合使用(如 AES + Base64)。
6.2 可能的擴(kuò)展方向
- 結(jié)合 AES、RSA 加密:Base64 可用于存儲(chǔ)和傳輸加密數(shù)據(jù)。
- 結(jié)合 JWT 認(rèn)證:JWT 的 payload 采用 Base64 編碼。
- 應(yīng)用于 HTTP 認(rèn)證:Basic Auth 使用 Base64 傳輸用戶名和密碼(但不安全,應(yīng)配合 HTTPS)。
通過本項(xiàng)目的實(shí)現(xiàn),讀者不僅可以掌握 Base64 編碼/解碼的基本方法,還能更好地理解其在信息傳輸和數(shù)據(jù)存儲(chǔ)中的實(shí)際應(yīng)用。希望這篇文章能幫助你深入理解 Base64 技術(shù),并在項(xiàng)目中靈活應(yīng)用。
總結(jié)
到此這篇關(guān)于java中BASE64加密/解密的文章就介紹到這了,更多相關(guān)java BASE64加密/解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于SpringCloud手寫一個(gè)簡(jiǎn)易版Sentinel
SpringCloud Alibaba Sentinel是當(dāng)前最為流行一種熔斷降級(jí)框架,簡(jiǎn)單易用的方式可以快速幫助我們實(shí)現(xiàn)服務(wù)的限流和降級(jí),保證服務(wù)的穩(wěn)定性。2021-05-05
jdk7 中HashMap的知識(shí)點(diǎn)總結(jié)
HashMap的原理是老生常談了,不作仔細(xì)解說。一句話概括為HashMap是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射。這篇文章主要總結(jié)了關(guān)于jdk7 中HashMap的知識(shí)點(diǎn),需要的朋友可以參考借鑒,一起來看看吧。2017-01-01
java判斷String類型是否能轉(zhuǎn)換為int的方法
今天小編就為大家分享一篇java判斷String類型是否能轉(zhuǎn)換為int的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
IDEA配置SpringBoot熱啟動(dòng),以及熱啟動(dòng)失效問題
這篇文章主要介紹了IDEA配置SpringBoot熱啟動(dòng),以及熱啟動(dòng)失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring?Boot?配置?Hikari?數(shù)據(jù)庫連接池的操作代碼
數(shù)據(jù)庫連接池是一個(gè)提高程序與數(shù)據(jù)庫的連接的優(yōu)化,連接池它主要作用是提高性能、節(jié)省資源、控制連接數(shù)、連接管理等操作,這篇文章主要介紹了SpringBoot配置Hikari數(shù)據(jù)庫連接池,需要的朋友可以參考下2023-09-09
spring cloud Hystrix斷路器的使用(熔斷器)
這篇文章主要介紹了spring cloud Hystrix斷路器的使用(熔斷器),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
深入解析Java的Servlet過濾器的原理及其應(yīng)用
這篇文章主要介紹了深入解析Java的Servlet過濾器的原理及應(yīng)用,Java編寫的Servlet通常是一個(gè)與網(wǎng)頁一起作用于瀏覽器客戶端的程序,需要的朋友可以參考下2016-01-01

