URL安全的Base64编码,解码

Base64 能够将二进制转码成可见字符方便进行http传输,可是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,致使两方面数据不一致。html

咱们能够在发送前将“+”,“/”,“=”替换成URL不会转码的字符,接收到数据后,再将这些字符替换回去,再进行解码。android

Base64加密转换原理与代码实现 :http://www.cnblogs.com/jxust-jiege666/p/8590116.html安全

PHP:app

 1     /**  2 
 3  * URL base64解码  4 
 5  * '-' -> '+'  6 
 7  * '_' -> '/'  8 
 9  * 字符串长度%4的余数,补'=' 10 
11  * @param unknown $string 12 
13      */
14 
15     public static function urlsafe_b64decode($string) { 16 
17         $data = str_replace(array('-','_'),array('+','/'),$string); 18 
19         $mod4 = strlen($data) % 4; 20 
21         if ($mod4) { 22 
23             $data .= substr('====', $mod4); 24 
25  } 26 
27         return base64_decode($data); 28 
29  } 30 
31     
32 
33     /** 34 
35  * URL base64编码 36 
37  * '+' -> '-' 38 
39  * '/' -> '_' 40 
41  * '=' -> '' 42 
43  * @param unknown $string 44 
45      */
46 
47     function urlsafe_b64encode($string) { 48 
49         $data = base64_encode($string); 50 
51         $data = str_replace(array('+','/','='),array('-','_',''),$data); 52 
53         return $data; 54 
55     }

 

OC:编码

 1 #pragma - 将saveBase64编码中的"-","_"字符串转换成"+","/",字符串长度余4倍的位补"="
 2 
 3 +(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str  4 
 5 {  6 
 7     // '-' -> '+'  8 
 9     // '_' -> '/' 10 
11     // 不足4倍长度,补'='
12 
13     NSMutableString * base64Str = [[NSMutableString alloc]initWithString:safeUrlbase64Str]; 14 
15     base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; 16 
17     base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"]; 18 
19     NSInteger mod4 = base64Str.length % 4; 20 
21     if(mod4 > 0) 22 
23         [base64Str appendString:[@"====" substringToIndex:(4-mod4)]]; 24 
25     NSLog(@"Base64原文:%@", base64Str); 26 
27     return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]]; 28 
29     
30 
31 } 32 
33  
34 
35 #pragma - 由于Base64编码中包含有+,/,=这些不安全的URL字符串,因此要进行换字符
36 
37 +(NSString*)safeUrlBase64Encode:(NSData*)data 38 
39 { 40 
41     // '+' -> '-' 42 
43     // '/' -> '_' 44 
45     // '=' -> ''
46 
47     NSString * base64Str = [GTMBase64 stringByEncodingData:data]; 48 
49     NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str]; 50 
51     safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; 52 
53     safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; 54 
55     safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""]; 56 
57     NSLog(@"safeBase64编码:%@", safeBase64Str); 58 
59     return safeBase64Str; 60 
61 }

 

Java:加密

 1 public static String safeUrlBase64Encode(byte[] data){  2 
 3 String encodeBase64 = new BASE64Encoder().encode(data);  4 
 5 String safeBase64Str = encodeBase64.replace('+', '-');  6 
 7 safeBase64Str = safeBase64Str.replace('/', '_');  8 
 9 safeBase64Str = safeBase64Str.replaceAll("=", ""); 10 
11 return safeBase64Str; 12 
13 } 14 
15  
16 
17 public static byte[] safeUrlBase64Decode(final String safeBase64Str){ 18 
19 String base64Str = safeBase64Str.replace('-', '+'); 20 
21 base64Str = base64Str.replace('_', '/'); 22 
23 int mod4 = base64Str.length()%4; 24 
25 if(mod4 > 0){ 26 
27 base64Str = base64Str + "====".substring(mod4); 28 
29 } 30 
31 return new BASE64Decoder().decodeBuffer(base64Str); 32 
33 } 34 
35

 

若是是Android的话,android.utils.Base64自带该功能:url

1 Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP) 2 Base64.decode(data, Base64.URL_SAFE);
相关文章
相关标签/搜索