欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

使用 base64 加密在URL安全传递|url_safe|php URL安全的Base64编码,解码 有大用

原文地址:http://www.pylist.com/topic/1435231261

-------------


base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。它可以把不能作为文本显示的二进制数据编码为可显示的文本信息。编码后的文本大小会增大1/3。

base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode, b64decode, urlsafe_b64decode, urlsafe_b64encode。他们8个可以两两分为4组,encode, decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码;encodestring, decodestring一组,专门用来编码和解码字符串; b64encode 和b64decode 一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode 和 b64decode 正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。urlsafe_b64encode 和urlsafe_b64decode 一组,这个就是用来专门对url进行base64 编解码的,实际上也是调用的前一组函数。

python 必须补齐=号才正常,不然会抛错no padding.

python版本:

def base64_url_decode(inp):
    # 通过url传输时去掉了=号,所以需要补上=号
    import base64
    return base64.urlsafe_b64decode(str(inp + '=' * (4 - len(inp) % 4)))

def base64_url_encode(inp):
    import base64
    return base64.urlsafe_b64encode(str(inp)).rstrip('=')

php版本:

function base64url_encode($data) { 
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
} 
function base64url_decode($data) { 
  return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); 
}

版权声明:https://github.com/wusuopubupt

来自  http://blog.csdn.net/wusuopubupt/article/details/49803777



URL安全的Base64编码,解码

原创 2016年03月05日 00:24:47

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

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


PHP:


    /**

     * URL base64解码

     * '-' -> '+'

     * '_' -> '/'

     * 字符串长度%4的余数,补'='

     * @param unknown $string

     */

    public static function urlsafe_b64decode($string) {

        $data = str_replace(array('-','_'),array('+','/'),$string);

        $mod4 = strlen($data) % 4;

        if ($mod4) {

            $data .= substr('====', $mod4);

        }

        return base64_decode($data);

    }

    

    /**

     * URL base64编码

     * '+' -> '-'

     * '/' -> '_'

     * '=' -> ''

     * @param unknown $string

     */

    function urlsafe_b64encode($string) {

        $data = base64_encode($string);

        $data = str_replace(array('+','/','='),array('-','_',''),$data);

        return $data;

    }



OC:



#pragma - saveBase64编码中的"-""_"字符串转换成"+""/",字符串长度余4倍的位补"="

+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str

{

    // '-' -> '+'

    // '_' -> '/'

    // 不足4倍长度,补'='

    NSMutableString * base64Str = [[NSMutableString alloc]initWithString:safeUrlbase64Str];

    base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"];

    base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"];

    NSInteger mod4 = base64Str.length % 4;

    if(mod4 > 0)

        [base64Str appendString:[@"====" substringToIndex:(4-mod4)]];

    NSLog(@"Base64原文:%@", base64Str);

    return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];

    

}


#pragma - 因为Base64编码中包含有+,/,=这些不安全的URL字符串,所以要进行换字符

+(NSString*)safeUrlBase64Encode:(NSData*)data

{

    // '+' -> '-'

    // '/' -> '_'

    // '=' -> ''

    NSString * base64Str = [GTMBase64 stringByEncodingData:data];

    NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str];

    safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];

    safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];

    safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];

    NSLog(@"safeBase64编码:%@"safeBase64Str);

    return safeBase64Str;

}


Java:


public static String safeUrlBase64Encode(byte[] data){

String encodeBase64 = new BASE64Encoder().encode(data);

String safeBase64Str = encodeBase64.replace('+''-');

safeBase64Str = safeBase64Str.replace('/''_');

safeBase64Str = safeBase64Str.replaceAll("=""");

return safeBase64Str;

}

public static byte[] safeUrlBase64Decode(final String safeBase64Str){

String base64Str = safeBase64Str.replace('-''+');

base64Str = base64Str.replace('_''/');

int mod4 = base64Str.length()%4;

if(mod4 > 0){

base64Str = base64Str + "====".substring(mod4);

}

return new BASE64Decoder().decodeBuffer(base64Str);

}


如果是Android的话,android.utils.Base64自带该功能:


Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP);


Base64.decode(data, Base64.URL_SAFE);




版权声明:本文为博主原创文章,未经博主允许不得转载。

来自  http://blog.csdn.net/mr_raptor/article/details/50806657


base64编码以及url safe base64是怎么工作的?

原文转自 http://www.yanshiba.com/archives/638

 

1: 为什么需要base64?

ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间.
其中,[0,31],及127, 33个属于不可打印的控制字符.

在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除.
还有的早期程序,收到[128,255]之间的国际字符时,甚至会发生错误.

如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件?
于是作为MIME多媒体电子邮件标准的一部分—base64被开发出来.

1.a 什么是url_safe base64编码?

在上面的base64传统编码中会出现+, /两个会被url直接转义的符号,因此如果希望通过url传输这些编码字符串,我们

需要先做传统base64编码,随后将+和/分别替换为- _两个字符,在接收端则做相反的动作解码

http://www.ietf.org/rfc/rfc4648.txt

复制代码
  /**
     * URL base64解码
     * '-' -> '+'
     * '_' -> '/'
     * 字符串长度%4的余数,补'='
     * @param unknown $string
     */
  function urlsafe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }
    
    /**
     * URL base64编码
     * '+' -> '-'
     * '/' -> '_'
     * '=' -> ''
     * @param unknown $string
     */
    function urlsafe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }
复制代码

 

2: 一句话说完base64怎么工作的?

把N字节的内容对应的8*N位, 每6位砍成1段,得到 (8*N)/6 个单元,
每个单元的值,都在[0,63]之间,再把其值对应1个ascii字符,拼接起来,OK!

base64_encode(’PHP’) ==> ‘UEhQ’, 编码过程如下:

3: 如果每6位砍成1段,但不能整除,余下2个位或4位怎么办?

用”0″来补至6位, 并再次转化为”base64字符表”中的某个字符.

然后,再用”=”字符当做6个位,继续填充,直至总位数能被8带整除.

字符串二进制序列(红字为填充位)编码结果
PHP010100 000100 100001 010000UEhQ
it011010 010111 0100

 

00 xxxxxx

aXQ=
bool011000 100110 111101 101111 011011 00

 

0000 xxxxxx xxxxxx

Ym9vbA==

4:base64表示图片

通过上面的演示,可以看出,base64也可以编码二进制文件,如邮件中的图片和附件.
编码后,我们可以在网页或邮件的源码里,直接体现此图片,
而不必把图片放在服务器上,引用其链接.

用例:base64(’abc.png’) ==> ‘encoded-result’;
则在网页中, <img src=”data:image/png;base64,encoded-result” />

看到下面这个5角星了吗? 右键看源码,就会发现图片是一串字符串 :)

5: base64编码后字节的变化

很容易推算出, 编码后,每6个位变成8个位.
因此,编码后字节约比编码前多33%.

6: base64串结尾的”=”可以去掉吗?

从上面的编码规则可以反推出, 在base64解码的过程中, 要清除掉结尾处的等号,
然后再反查”base64索引与字母对照表”,转换成原始的字节序列.

那么,去掉尾部的等号,并没有丢失原始信息,但结构变得不规范.
解码前是否判断完整性,这取决于你的应用程序.

实测PHP中的base64_decode函数,并不检测尾部的等号是否完整.

来自 https://www.cnblogs.com/kidsitcn/p/6901431.html


PHP安全的URL字符串base64编码和解码

转载 2016年03月30日 17:41:20

如果直接使用base64_encode和base64_decode方法的话,生成的字符串可能不适用URL地址。下面的方法可以解决该问题:

URL安全的字符串编码:

复制代码代码如下:

function urlsafe_b64encode($string) {
   $data = base64_encode($string);
   $data = str_replace(array('+','/','='),array('-','_',''),$data);
   return $data;
 }



URL安全的字符串解码:

复制代码代码如下:

function urlsafe_b64decode($string) {
   $data = str_replace(array('-','_'),array('+','/'),$string);
   $mod4 = strlen($data) % 4;
   if ($mod4) {
       $data .= substr('====', $mod4);
   }
   return base64_decode($data);
 }

来自  http://www.jb51.net/article/51239.htm

普通分类: