怎么对 url 进行url base64编码码

ASP.NET網站專案,使用Query String傳送Base64編碼後的參數值(例如: MyApp.aspx?d=RGFya3RocmVhZCBSb2NrcyEh),卻發現測試有時成功有時失敗,最後查出是程式產生URL時沒有對Base64字串進行UrlEncode編碼所造成的問題。
使用了 &ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/&,再加上補齊長度的1個或2個&=&符號,共計65個字元。其中只有&=&與&+&在Query String有特殊含意,&=&用來連接參數名稱與值、&+&則用來表示& &(空白符號)。”?a=ab=&b=123”的寫法仍在程式Request.QueryString的識別容忍範圍,可靠&&&符號或結尾認出a = &ab=&,但若參數值出現&+&,例如: ?a=X+Y,則Request.QueryString[&a&]的結果就會變成&X Y&。換句話說,若是Base64的編碼結果好死不死出現&+&(機率不低),在伺服器端取QueryString變數時就會被解讀成& &(空白),導致Base64解碼錯誤。
要解決這個問題,只需使用Server.UrlEncode()或HttpUtility.UrlEncode()對Base64編碼後的字串再做一次編碼即可,如此&+&會變成%2b、&=&會被轉成%3d,在Request.QueryString取值時就可正確無誤地還原。
除此之外,若要交由Javascript端處理,則可使用encodeURIComponent()進行編碼(注意: escape()、encodeURI()、encodeURIComponent()的編碼原則不盡相同,這裡有一篇說明三者的差異);再不然,由於其中關鍵只在於&+&,而空白符好並非Base64的合法字元,若傳入參數無法加工,可在Server端將讀取結果中的& &再換回&+&,雖然嚴謹度較差,但也是種解法。
以下是重現問題及展示解法的範例:
&%@ Page Language=&C#& %&
&!DOCTYPE html&
&script runat=&server&&
void Page_Load(object sender, EventArgs e)
Encoding enc = Encoding.UTF8;
base64_sample.Value =
Convert.ToBase64String(enc.GetBytes(&&A&&));
//故意產生含&+&符號的Base64編碼
string mode = Request[&mode&];
string b64 = Request[&b64&];
if (!string.IsNullOrEmpty(mode))
Response.ContentType = &text/plain&;
if (mode == &decode&)
string res = enc.GetString(Convert.FromBase64String(b64));
Response.Write(&Result=& + res);
catch (Exception ex)
Response.Write(&Error: & + ex.Message);
else if (mode == &decode-fix&)
string res = enc.GetString(
Convert.FromBase64String(FixBase64FromQueryString(b64)));
Response.Write(&Result(Fixed)=& + res);
Response.End();
//由於QueryString中Base64的&+&會被解讀成空白符號,故用函數還原
string FixBase64FromQueryString(string b)
return b.Replace(& &, &+&);
&html xmlns=&http://www.w3.org/1999/xhtml&&
&head runat=&server&&
&title&Base64 Test&/title&
&script src=&/ajax/jQuery/jquery-1.6.2.js&
type=&text/javascript&& &/script&
$(function () {
$(&input&).click(function () {
var v = $(&#base64_sample&).val();
var m = &decode&;
//b2鈕,使用encodeURIComponent對Base64編碼內容再做編碼
//注意: escape()或encodeURI()不會轉換&+&,不要用錯
if (this.id == &b2&) v = encodeURIComponent(v);
//b3鈕,參數維持原貌(含&+&),在Server端再做處理
if (this.id == &b3&) m += &-fix&;
var url = location.href + &?mode=& + m + &&b64=& +
$(&#dUrl&).text(url);
$(&#fDisp&).attr(&src&, url);
body { padding: 10 }
div { margin: 5 }
input { width: 120 margin-right: 10 }
&form id=&form1& runat=&server&&
&input type=&hidden& id=&base64_sample& runat=&server& /&
&input type=&button& id=&b1& value=&直接傳送& /&
&input type=&button& id=&b2& value=&參數編碼後傳送& /&
&input type=&button& id=&b3& value=&Server端修正& /&
&div id=&dUrl&&&&/div&
&iframe id=&fDisp& style=&width: 400&&&/iframe&
Test 1 沒進行UrlEncode或encodeURIComponent()就直接當成參數傳送會導致錯誤
Test 2 便用encodeURIComponent()轉換,&+&會被轉成%2B可避開問題
Test 3 ASP.NET Server端接入Request[“b64”]後再將空白換回&+&
歡迎推文分享:
Views: 15,457
SunMonTueWedThuFriSat2829303146810111213171921242526272912345678
讚讚讚 TIPS-用URL傳送Base64編碼
一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案,
也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。Base64编码不要用在URL中 - ITeye问答
今天有位兄弟把base64编码过的string放在了url中,如:
http://***.com?key=base64codestring
孰不知base64编码后的字符串中有=号,而在服务器端根据key读取querystring(或parameter map)的时候就会截断掉=号,解码时就出现了问题。
好像不是这个问题,问题还在调查中。
URL为啥不用URLEncoder编码呢?
问题补充kdlan 写道BASE64有专门的url改进的编码
把=和+都替换了
采纳的答案
引用URL为啥不用URLEncoder编码呢?
大家都知道规则,这样,使用get方式,一定子就能知道请求的具体内容。
使用自定义方式的url encoder,增加了直接decode的难度。
taobao上使用的就是自定义的encoder方式。
Java中给了URLEncoder的静态方法编码url了,html标准推荐用utf8编码,其他都可能出现不兼容;base64有很多变种,得选择一种合适的形式
有些文件上传就是采用base64编码提交上传的,在服务器段要对接受到的base64编码进行一个小小的处理,就可以生成文件了。比如一些在线截屏功能,就用的是这种结构
BASE64有专门的url改进的编码把=和+都替换了
已解决问题
未解决问题用户名:wen5566
文章数:92
评论数:19
访问量:59365
注册日期:
阅读量:1297
阅读量:3317
阅读量:448728
阅读量:1133555
51CTO推荐博文
package&com.tw. &&import&java.io.IOE &&&&&&&&&&&public&class&Base64EnAndDeCode&{ &&&&&&&&&&&&&&&public&static&String&encode(byte[]&bstr){ &&&&&return&new&sun.misc.BASE64Encoder().encode(bstr); &&&&&} &&&&&&&&&&&&&&&public&static&byte[]&decode(String&str){ &&&&&byte[]&bt&=&null; &&&&&try&{ &&&&&&&&&sun.misc.BASE64Decoder&decoder&=&new&sun.misc.BASE64Decoder(); &&&&&&&&&bt&=&decoder.decodeBuffer(&str&); &&&&&}&catch&(IOException&e)&{ &&&&&&&&&e.printStackTrace(); &&&&&} &&&&&&&&&return& &&&&&} &&&&&&&&&&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Base64EnAndDeCode&te&=&new&Base64EnAndDeCode(); &&&&&&&&&String&oldStr&=&&我的会议tw&; &&&&&&&&&oldStr&=&te.encode(oldStr.getBytes()); &&&&&&&&&System.out.println(&----oldStr:&+oldStr); &&&&&&&&& &&&&&&&&&String&str3&=&&5oiR55qE5Lya6K6udHc!&; &&&&&&&&& &&&&&&&&&String&str&=&oldS &&&&&&&&&String&str2&=&new&String(te.decode(str)); &&&&&&&&&System.out.println(&-----str2:&+str2); &&&&&} &&} &
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)JavaScript Base64 实现 通过 URL 传递 base64 编码 中文参数的问题_和浏览器判断
我的图书馆
JavaScript Base64 实现 通过 URL 传递 base64 编码 中文参数的问题_和浏览器判断
:转载时请以超链接形式标明文章原始出处和作者信息及一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。但是对于带有中文的参数来说,这种编码会使编码后的字符 串变得很长。如果希望有短一点的方式对参数编码,可以采用 base64 编码方式对字符串进行编码,但是 base64 编码方式不能处理 # 中的中文,因为 # 中的中文都是以 UTF-16 方式保存的。而 base64 只能处理单字节字符,所以不能直接用 base64 对带有中文的 # 字符串进行编码。但是可以通过&&这个程序中提供的 utf16to8 来将 UTF-16 编码的中文先转化为 UTF-8 方式,然后再进行 base64 编码。这样编码后的字符串,在传递到服务器端后可以直接通过 base64_decode 解码成 UTF-8 的中文字符串。但是还有个问题需要注意。base64 编码中使用了加号(+),而 + 在 URL 传递时会被当成空格,因此必须要将 base64 编码后的字符串中的加号替换成 %2B 才能当作 URL 参数进行传递。否则在服务器端解码后就会出错。&《script》var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";&var base64DecodeChars = new Array(&&&&&&&&&& -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,&&&&&&&&&& -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,&&&&&&&&&& -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,&&&&&&&&&& 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,&&&&&&&&&& -1,&&& 0,&&& 1,&&& 2,&&& 3,&&& 4,&&& 5,&&& 6,&&& 7,&&& 8,&&& 9, 10, 11, 12, 13, 14,&&&&&&&&&& 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,&&&&&&&&&& -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,&&&&&&&&&& 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1&&&&&& );//编码函数&function base64encode(str) {&&&&&& var out, i,&&&&&& var c1, c2, c3;&&&&&& len = str.&&&&&& i = 0;&&&&&& out = "";&&&&&& while(i & len) {&&&&&&&&&& c1 = str.charCodeAt(i++) & 0&&&&&&&&&& if(i == len) {&&&&&&&&&&&&&& out += base64EncodeChars.charAt(c1 && 2);&&&&&&&&&&&&&& out += base64EncodeChars.charAt((c1 & 0x3) && 4);&&&&&&&&&&&&&& out += "==";&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&& c2 = str.charCodeAt(i++);&&&&&&&&&& if(i == len) {&&&&&&&&&&&&&& out += base64EncodeChars.charAt(c1 && 2);&&&&&&&&&&&&&& out += base64EncodeChars.charAt(((c1 & 0x3)&& 4) | ((c2 & 0xF0) && 4));&&&&&&&&&&&&&& out += base64EncodeChars.charAt((c2 & 0xF) && 2);&&&&&&&&&&&&&& out += "=";&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&& c3 = str.charCodeAt(i++);&&&&&&&&&& out += base64EncodeChars.charAt(c1 && 2);&&&&&&&&&& out += base64EncodeChars.charAt(((c1 & 0x3)&& 4) | ((c2 & 0xF0) && 4));&&&&&&&&&& out += base64EncodeChars.charAt(((c2 & 0xF) && 2) | ((c3 & 0xC0) &&6));&&&&&&&&&& out += base64EncodeChars.charAt(c3 & 0x3F);&&&&&& }&&&&&&&}//解码函数&function base64decode(str) {&&&&&& var c1, c2, c3, c4;&&&&&& var i, len,&&&&&& len = str.&&&&&& i = 0;&&&&&& out = "";&&&&&& while(i & len) {&&&&&&&&&& /* c1 */&&&&&&&&&& do {&&&&&&&&&&&&&& c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];&&&&&&&&&& } while(i & len && c1 == -1);&&&&&&&&&&&&&&&&&&& if(c1 == -1)&&&&&&&&&&&&&&&&&&&&&&&& /* c2 */&&&&&&&&&& do {&&&&&&&&&&&&&& c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];&&&&&&&&&& } while(i & len && c2 == -1);&&&&&&&&&&&&&&&&&&& if(c2 == -1)&&&&&&&&&&&&&&&&&&&&&&&& out += String.fromCharCode((c1 && 2) | ((c2 & 0x30) && 4));&&&&&&&&&& /* c3 */&&&&&&&&&& do {&&&&&&&&&&&&&& c3 = str.charCodeAt(i++) & 0&&&&&&&&&&&&&& if(c3 == 61)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& c3 = base64DecodeChars[c3];&&&&&&&&&& } while(i & len && c3 == -1);&&&&&&&&&&&&&&&&&&& if(c3 == -1)&&&&&&&&&&&&&&&&&&&&&&&& out += String.fromCharCode(((c2 & 0XF) && 4) | ((c3 & 0x3C) && 2));&&&&&&&&&& /* c4 */&&&&&&&&&& do {&&&&&&&&&&&&&& c4 = str.charCodeAt(i++) & 0&&&&&&&&&&&&&& if(c4 == 61)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& c4 = base64DecodeChars[c4];&&&&&&&&&& } while(i & len && c4 == -1);&&&&&&&&&&&&&&&&&&& if(c4 == -1)&&&&&&&&&&&&&&&&&&&&&&&& out += String.fromCharCode(((c3 & 0x03) && 6) | c4);&&&&&& }&&&&&&&}function utf16to8(str) {&&&& var out, i, len,&&& out = "";&&&& len = str.&&&& for(i = 0; i & i++) {&&c = str.charCodeAt(i);&&if ((c &= 0x0001) && (c &= 0x007F)) {&&&&& out += str.charAt(i);&&} else if (c & 0x07FF) {&&&&& out += String.fromCharCode(0xE0 | ((c && 12) & 0x0F));&&&&& out += String.fromCharCode(0x80 | ((c &&& 6) & 0x3F));&&&&& out += String.fromCharCode(0x80 | ((c &&& 0) & 0x3F));&&} else {&&&&& out += String.fromCharCode(0xC0 | ((c &&& 6) & 0x1F));&&&&& out += String.fromCharCode(0x80 | ((c &&& 0) & 0x3F));&&}&&&& }&&&&&}function utf8to16(str) {&&&& var out, i, len,&&&& var char2, char3;&&& out = "";&&&& len = str.&&&& i = 0;&&&& while(i & len) {&&c = str.charCodeAt(i++);&&switch(c && 4)&&{&&& case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:&&&&& // 0xxxxxxx&&&&& out += str.charAt(i-1);&&&&&&&& case 12: case 13:&&&&& // 110x xxxx&& 10xx xxxx&&&&& char2 = str.charCodeAt(i++);&&&&& out += String.fromCharCode(((c & 0x1F) && 6) | (char2 & 0x3F));&&&&&&&& case 14:&&&&& // 1110 xxxx& 10xx xxxx& 10xx xxxx&&&&& char2 = str.charCodeAt(i++);&&&&& char3 = str.charCodeAt(i++);&&&&& out += String.fromCharCode(((c & 0x0F) && 12) |&&&&&&&& ((char2 & 0x3F) && 6) |&&&&&&&& ((char3 & 0x3F) && 0));&&&&&&&}&&&& }&&&&}&function CheckBrowser(){&&&& var cb = "Unknown";&&&& if(window.ActiveXObject){&&&&&&&& cb = "IE";&&&& }else if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1){&&&&&&&& cb = "Firefox";&&&& }else if((typeof document.implementation != "undefined") && (typeof document.implementation.createDocument != "undefined") && (typeof HTMLDocument != "undefined")){&&&&&&&& cb = "Mozilla";&&&& }else if(navigator.userAgent.toLowerCase().indexOf("opera") != -1){&&&&&&&& cb = "Opera";&&&& }&&&&&}&《/script》&例子:&if(CheckBrowser()=="Firefox"){&&&kindex += "&cpr_role_name="+cpr_role_&&&kindex += "&cpr_client_name="+cpr_client_&&&kindex += "&cpr_organization_name="+cpr_organization_&&&kindex += "&cpr_weaehouse_name="+cpr_weaehouse_&&}else{&&&kindex += "&cpr_role_name="+(encode64(utf16to8(cpr_role_name)).replace("+","%2B"));&&&kindex += "&cpr_client_name="+(encode64(utf16to8(cpr_client_name)).replace("+","%2B"));&&&kindex += "&cpr_organization_name="+(encode64(utf16to8(cpr_organization_name)).replace("+","%2B"));&&&kindex += "&cpr_weaehouse_name="+(encode64(utf16to8(cpr_weaehouse_name)).replace("+","%2B"));&&}PHP:& &if(stripos($_SERVER["HTTP_USER_AGENT"],"Firefox")){&& &&die(stripos($_SERVER["HTTP_USER_AGENT"],"Firefox"));&&$cpr_role_name = $_GET['cpr_role_name'];&&$cpr_client_name = $_GET['cpr_client_name'];&&$cpr_organization_name = $_GET['cpr_organization_name'];&&$cpr_weaehouse_name = $_GET['cpr_weaehouse_name'];&&&}else{&&&$cpr_role_name = base64_decode($_GET['cpr_role_name']);&&&$cpr_client_name = base64_decode($_GET['cpr_client_name']);&&&$cpr_organization_name = base64_decode($_GET['cpr_organization_name']);&&&$cpr_weaehouse_name = base64_decode($_GET['cpr_weaehouse_name']);&&&}例2:&script type="text/#" src="&&script&var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";&function base64encode(str) {&&&&& var out, i,&&&&& var c1, c2, c3;&&&&& len = str.&&&&& i = 0;&&&&& out = "";&&&&& while(i & len) {&&&&&&&&& c1 = str.charCodeAt(i++) & 0&&&&&&&&& if(i == len) {&&&&&&&&&&&&& out += base64EncodeChars.charAt(c1 && 2);&&&&&&&&&&&&& out += base64EncodeChars.charAt((c1 & 0x3) && 4);&&&&&&&&&&&&& out += "==";&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&& c2 = str.charCodeAt(i++);&&&&&&&&& if(i == len) {&&&&&&&&&&&&& out += base64EncodeChars.charAt(c1 && 2);&&&&&&&&&&&&& out += base64EncodeChars.charAt(((c1 & 0x3)&& 4) | ((c2 & 0xF0) && 4));&&&&&&&&&&&&& out += base64EncodeChars.charAt((c2 & 0xF) && 2);&&&&&&&&&&&&& out += "=";&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&& c3 = str.charCodeAt(i++);&&&&&&&&& out += base64EncodeChars.charAt(c1 && 2);&&&&&&&&& out += base64EncodeChars.charAt(((c1 & 0x3)&& 4) | ((c2 & 0xF0) && 4));&&&&&&&&& out += base64EncodeChars.charAt(((c2 & 0xF) && 2) | ((c3 & 0xC0) &&6));&&&&&&&&& out += base64EncodeChars.charAt(c3 & 0x3F);&&&&& }&&&&&}function utf16to8(str) {&&& var out, i, len,&&& out = "";&&& len = str.&&& for(i = 0; i & i++) {&c = str.charCodeAt(i);&if ((c &= 0x0001) && (c &= 0x007F)) {&&&& out += str.charAt(i);&} else if (c & 0x07FF) {&&&& out += String.fromCharCode(0xE0 | ((c && 12) & 0x0F));&&&& out += String.fromCharCode(0x80 | ((c &&& 6) & 0x3F));&&&& out += String.fromCharCode(0x80 | ((c &&& 0) & 0x3F));&} else {&&&& out += String.fromCharCode(0xC0 | ((c &&& 6) & 0x1F));&&&& out += String.fromCharCode(0x80 | ((c &&& 0) & 0x3F));&}&&& }&&&}function CheckBrowser(){&&& var cb = "Unknown";&&& if(window.ActiveXObject){&&&&&&& cb = "IE";&&& }else if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1){&&&&&&& cb = "Firefox";&&& }else if((typeof document.implementation != "undefined") && (typeof document.implementation.createDocument != "undefined") && (typeof HTMLDocument != "undefined")){&&&&&&& cb = "Mozilla";&&& }else if(navigator.userAgent.toLowerCase().indexOf("opera") != -1){&&&&&&& cb = "Opera";&&& }&&&}function trans#(value){&&&& if(CheckBrowser()=="Firefox"){&&&&& &&& }else{&&& value=base64encode(utf16to8(value)).replace("+","%2B");&&& }&& window.location="__APP__/Index/search/smalltype/"+value+"/";}&/script&PHP&function search(){&&&&&if(stripos($_SERVER["HTTP_USER_AGENT"],"Firefox")){&&&&&& $value= $_GET[value];&&&&}else{&&&&&&& $value= base64_decode($_GET[value]); &&&&&& &}}
TA的推荐TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢posts - 182,&
comments - 152,&
trackbacks - 0
2.1、算法基本规则:
加密的算法公开
加密的密钥不公开
Base64算法公开、密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作。
注意:具体的算法与密钥(对于Base64来讲,是一张字符映射表)可在《Java加密与解密的艺术(第2版)》第5章&电子邮件传输算法--Base64&中查看
2.2、应用场景
简单加密(加密要求不高的情况下,即一眼看不穿的那种情况下使用)
加密(改造字符映射表,即私藏秘钥)
电子邮件传输(邮件内容使用Base64加密,实际上主要是处理中文问题的)
网络数据传输(与URLBase64相关,下边会讲)
密钥存储(密钥是一段二进制数据,密钥在通信双方的传递过程:甲方将密钥采用Base64编码,写入文档,通过安全途径(例如线下等)传给乙方,采用Base64存储密钥是为了增强密钥的易读性)
数字证书存储
OpenSSL操作Base64产生数字证书
通常,我们使用Base64最多的情况就是存储密钥。
2.3、Base64实现方式
实现方式有三种:
Commons Codec(简称&CC&)
Bouncy Castle(简称&BC&)
JDK(不推荐使用,当做JDK没实现即可)
其中,最推荐使用Commons Codec。
注意:cc与bc的版本号,还有我实在jdk1.6下边调的
2.3.1、基于CC实现的Base64加解密
第一步:加入jar
第二步:编写代码
1 package com.util.base64;
3 import java.io.UnsupportedEncodingE
4 import mons.codec.binary.Base64;
* 基于Commons Codec的Base64加密
9 public class Base64CoderCC {
private static final String ENCODING = "UTF-8";
* 一般Base64加密
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Base64.encodeBase64(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
* 安全Base64加密
public static String encodeSafe(String data) throws UnsupportedEncodingException{
* 注意:这里采用的encodeBase64(byte[] bytes, boolean arg1)
* arg1为true时,加密后的字符串每行为76个字符,不论每行够不够76个字符,都要在行尾添加&\r\n&
byte[] encodedByte = Base64.encodeBase64(data.getBytes(ENCODING),true);
return new String(encodedByte, ENCODING);
* Base64解密
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
* @param args
* @throws UnsupportedEncodingException
public static void main(String[] args) throws UnsupportedEncodingException {
/********************测试一般encode*********************/
String data = "找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文--&"+data);
String encodedStr = Base64CoderCC.encode(data);
System.out.println("加密后--&"+encodedStr);
String decodedStr = Base64CoderCC.decode(encodedStr);
System.out.println("解密后--&"+decodedStr);
System.out.println(data.equals(decodedStr));
System.out.println("================================");
/********************测试安全encode*********************/
String data2 = "找一个好姑娘做老婆是我的梦 想!找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文--&"+data2);
String encodedStr2 = Base64CoderCC.encodeSafe(data2);
System.out.println("加密后--&"+encodedStr2);
String decodedStr2 = Base64CoderCC.decode(encodedStr2);
System.out.println("解密后--&"+decodedStr2);
System.out.println(data2.equals(decodedStr2));
第三步:测试
上述代码的main()方法。
&测试结果:
注意:可以采用debug断点调试来查看每一个变量的值来验证上边的情况。
&2.3.2、基于BC实现的Base64加解密算法
对于BC来讲,只有一般Base64加密算法,jar包以及简要代码如下:
1 package com.util.base64;
3 import java.io.UnsupportedEncodingE
5 import org.bouncycastle.util.encoders.Base64;
* 基于Bouncy Castle的Base64加密
10 public class Base64CoderBC {
private static final String ENCODING = "UTF-8";
* Base64加密
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Base64.encode(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
* Base64解密
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.decode(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
* @param args
* @throws UnsupportedEncodingException
public static void main(String[] args) throws UnsupportedEncodingException {
String data = " 找一个好姑娘做老婆是我的梦 想!
System.out.println("原文--&"+data);
String encodedStr = Base64CoderBC.encode(data);
System.out.println("加密后--&"+encodedStr);
String decodedStr = Base64CoderBC.decode(encodedStr);
System.out.println("解密后--&"+decodedStr);
System.out.println(data.equals(decodedStr));
2.4、URLBase64实现方式
一般来讲这种算法仅用于使用get方式传递私密数据和以get方式传递二进制数据。
commons codec(CC,推荐使用,因为不采用尾部补全,所以数据长度较短,减少了网络传输时间,尾部补全是Base64的)
bouncy castle(BC)
2.4.1、基于CC实现URLBase64
1 package com.util.base64;
3 import java.io.UnsupportedEncodingE
4 import mons.codec.binary.Base64;
* 基于Commons Codec的URLBase64加密
8 public class URLBase64CoderCC {
private static final String ENCODING = "UTF-8";
* URLBase64加密
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Base64.encodeBase64URLSafe(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
* URLBase64解密
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
* @param args
* @throws UnsupportedEncodingException
public static void main(String[] args) throws UnsupportedEncodingException {
String data = "找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文--&"+data);
String encodedStr = URLBase64CoderCC.encode(data);
System.out.println("加密后--&"+encodedStr);
String decodedStr = URLBase64CoderCC.decode(encodedStr);
System.out.println("解密后--&"+decodedStr);
System.out.println(data.equals(decodedStr));
&测试结果自己查看。
2.4.2、基于BC实现URLBase64
1 package com.util.base64;
3 import java.io.UnsupportedEncodingE
4 import org.bouncycastle.util.encoders.UrlBase64;
* 基于BC的URLBase64加密
8 public class URLBase64CoderBC {
private static final String ENCODING = "UTF-8";
* URLBase64加密
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = UrlBase64.encode(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
* URLBase64解密
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = UrlBase64.decode(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
* @param args
* @throws UnsupportedEncodingException
public static void main(String[] args) throws UnsupportedEncodingException {
String data = "找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文--&"+data);
String encodedStr = URLBase64CoderBC.encode(data);
System.out.println("加密后--&"+encodedStr);
String decodedStr = URLBase64CoderBC.decode(encodedStr);
System.out.println("解密后--&"+decodedStr);
System.out.println(data.equals(decodedStr));
&测试结果自己查看加密后的字符串与CC加密后字符串有什么不同。
阅读(...) 评论()

我要回帖

更多关于 对url进行base64编码 的文章

 

随机推荐