base64分兩個:一個是base64針對郵件傳輸?shù)乃惴āA硗庖粋€就是為了在瀏覽器中傳送加密數(shù)據(jù)或者隱藏表單中用的加密數(shù)據(jù),防止大家直接用肉眼從頁面中看到數(shù)據(jù)內(nèi)容而采用的URL base64。其實只要是我們想讓加密數(shù)據(jù)可逆,或者想將數(shù)據(jù)不讓別人用肉眼就分辨出來,就可以用base64的算法。一些機(jī)構(gòu)給客戶的簽名值都使用base64加密后提供.
關(guān)于urlbase64算法,目前沒定義,不過我們可以參考rfc 4648的規(guī)范要求
詳細(xì)介紹參見:http://baike.baidu.com/view/469071.htm
base64算法是一個違反加密原則的加密算法。
加密原則:公布算法,但是不公布密鑰
但是base64是即公布算法又公布了轉(zhuǎn)換的密鑰。不過我們可以通過改進(jìn)base64算法來提升base64的實用性。
關(guān)于實現(xiàn):
jdk6有sun公司內(nèi)部使用base64算法的實現(xiàn),這里不推薦使用,因為用他們內(nèi)部的實現(xiàn),編譯提示錯誤。說不定哪天丟失
這里推薦使用Bouncy Castle的實現(xiàn)或者apache的commons codec的實現(xiàn)。
(1)、Bouncy Castle的實現(xiàn)跟rfc的標(biāo)準(zhǔn)略有出入
(2)、commons codec的實現(xiàn)緊密追隨rfc2045的文檔
舉例嘗試Bouncy Castle的加解密算法:
1、base64的算法實現(xiàn)
package com.ca.test;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
/**
*
* 使用bouncycastle擴(kuò)展包進(jìn)行base64為編碼
* @kongqz
* **/
public class Base64Coder {
public final static String ENCODING="UTF-8";
/***
* 進(jìn)行base64編碼
* @param data 要編碼的數(shù)據(jù)
* @return 編碼后的數(shù)據(jù)
* */
public static String encode(String data) throws Exception{
Security.addProvider(new BouncyCastleProvider());
byte[] b =Base64.encode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
/**
* 進(jìn)行Base64解碼
* @param data 待解碼數(shù)據(jù)
* @return 解碼后的數(shù)據(jù)
* */
public static String decode(String data) throws Exception{
Security.addProvider(new BouncyCastleProvider());
byte[] b=Base64.decode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String tmp="java的base64位加解密操作";
System.out.println("原文:"+tmp);
String code=Base64Coder.encode(tmp);
System.out.println("編碼后:"+code);
System.out.println("解碼后:"+Base64Coder.decode(code));
}
}
控制臺輸出的結(jié)果為:
原文:java的base64位加解密操作
編碼后:amF2YeeahGJhc2U2NOS9jeWKoOino+WvhuaTjeS9nA==
解碼后:java的base64位加解密操作
2、urlbase64的算法實現(xiàn)
package com.ca.test;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.UrlBase64;
/**
*
* 使用bouncycastle擴(kuò)展包進(jìn)行base64為編碼.此處是針對URLbase64算法的演示
* @kongqz
* */
public class UrlBase64Coder {
public final static String ENCODING="UTF-8";
/***
* 進(jìn)行urlBase64編碼
* @param data 要編碼的數(shù)據(jù)
* @return 編碼后的數(shù)據(jù)
* */
public static String encode(String data) throws Exception{
Security.addProvider(new BouncyCastleProvider());
byte[] b =UrlBase64.encode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
/**
* 進(jìn)行urlBase64解碼
* @param data 待解碼數(shù)據(jù)
* @return 解碼后的數(shù)據(jù)
* */
public static String decode(String data) throws Exception{
Security.addProvider(new BouncyCastleProvider());
byte[] b=UrlBase64.decode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String tmp="java的urlbase64位加解密操作";
System.out.println("原文:"+tmp);
String code=UrlBase64Coder.encode(tmp);
System.out.println("編碼后:"+code);
System.out.println("解碼后:"+UrlBase64Coder.decode(code));
}
}
控制臺輸出結(jié)果如下:
原文:java的urlbase64位加解密操作
編碼后:amF2YeeahHVybGJhc2U2NOS9jeWKoOino-WvhuaTjeS9nA..
解碼后:java的urlbase64位加解密操作
對比后我們可以發(fā)現(xiàn)一個問題,就是urlbase64算法就是將瀏覽器中不允許出現(xiàn)的+=號給替換成-.這些符號