我们目前使用的是http协议
http协议传输的数据包:
请求行 url 请求方式 http版本
请求头 user-agent cookie, content-type, xml, referer
请求体 如果是get就没有请求体, 如果是post,请求体中会存放数据
字符串
http协议. 发送数据的时候. 字符串是最好处理的.
http处理字符串是非常容易的. 传输的时候效率也是高的.
在发送和处理字节的时候. 是很麻烦.
网站如果想要对自己的数据进行保护. 很有可能对数据进行加密
“我爱alex” => 加密之后. => 一堆无法辨认的字节(用眼睛一定看不出原来长啥样)
这就导致. 加密后的内容和服务器之间进行交互. 就很难受
就需要想一个办法. 把字节能不能处理成http容易处理的字符串
base64 -> 由大写字母,小写字母, 数字0-9 以及/和+组成 -64个符号
base64用来 把字节变成 字符串 把字符串还可以还原成字节
base64处理的时候. 三个字节一起处理 -> 处理成4的字符
base64处理后的字节 会比原来大一点点
Base64编码要求把3个8位字节(#add字母用ascii表示)(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。
如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’。
这样,长度为3个字节的数据经过Base64编码后就变为4个字节。
Python 中的 base64 模块提供了 b64decode 函数,用于对 Base64 编码的数据进行解码。
其基本语法如下:
import base64
result = base64.b64decode(s, altchars=None, validate=False)
其中: - s:要进行解码的字符串,必须是 Base64 编码过的字符串。
- altchars:由于 Base64 编码出来的字符集中包含 “/”, “+” 等特殊字符,在不同的场景下可能需要对其进行替换,此参数用于指定替换的字符。
- validate:指定是否在解码过程中对数据进行长度和填充等校验,默认为 False。 下面是一个具体的例子:
b64decode 的参数:altchars
由于 Base64 编码出来的字符集中可能包含某些在不同环境下需要进行特殊处理的字符,因此在解码过程中可能需要对其进行替换。这就需要用到 b64decode 函数的 altchars 参数。 下面是一个例子:
import base64
encoded = b’cGVvcGxlLmNvbQ==’
decoded = base64.b64decode(encoded, altchars=b’-_')
print(decoded)
输出结果为:b’people.com’ 在这个例子中,我们使用了 base64.b64decode 函数,并指定了 altchars 参数为 b’-’ ,表示在进行解码时需要将编码过的字符集中的 “+” 替换成 “-”,将 “/” 替换成 ""。
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,
而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,
这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
注意, b64处理后的字符串长度. 一定是4的倍数. 如果在网页上看到有些密文的b64长度不是4的倍数. 会报错
如下,base64解析报错
import base64
s = “ztKwrsTj0b0”
bb = base64.b64decode(s)
print(bb)
import base64
#注意, b64处理后的字符串长度. 一定是4的倍数. 如果在网页上看到有些密文的b64长度不是4的倍数. 会报错
# s = "ztKwrsTj0b0"
# bb = base64.b64decode(s)
# print(bb)
# 就为了得到一段字节
s = "我爱你"
# 字符串变成字节 -> encode()
bs = s.encode("utf-8")
print(bs)
# # 把字节转化成base64的字符串, base64.b64encode(bs)传的参数是字节
b64_str = base64.b64encode(bs) # 把字节编码成b64字符串
#变成了二进制的形式的字节
print(b64_str)
b64_str = b64_str.decode() #转化为字符串
print('转化为base64字符串:',b64_str)
#简写,里面传的参数是字节
s = base64.b64encode(bs).decode()
print(s)
# # 如果有了b64字符串, 还原成字节
s = "5oiR54ix5L2g"
bs = base64.b64decode(s) # 把base64字符串还原成字节 传的参数是字符串
print(bs)
#url解码
s = “http://www.baidu.com/s?wd=%E5%A4%A7%E7%8E%8B”
print(unquote(s)) # http://www.baidu.com/s?wd=大王
base64其实很容易理解. 通常被加密后的内容是字节. 而我们的密文是用来传输的(不传输谁加密啊).
但是, 在http协议里想要传输字节是很麻烦的一个事儿. 相对应的. 如果传递的是字符串就好控制的多. 此时base64就应运而生了. 26个大写字母+26个小写字母+10个数字+2个特殊符号(+和/)组成了一组类似64进制的计算逻辑. 这就是base64了.
我们可以将那个base64字符串解析成字节,保存下来
#base64的字符串
s = “iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqNJREFUaN7tWMtu1DAULeL1B2XBCgRL3j8APwBLxIblsCqbfkAH/qAJsROGne2CsuiyXY5gTVsJluUfAIlHRRkN9ySdiTMMtZ3JJIzqK1mKZnJ9z/E9vnbu0pI3b968Lbxxnl4MIvV4PRJd0wi5WsO78PkvwK/H6kHAxE8CN3Qb8kfIxP12wTN1h4AcuoMfkzh8kYjbrYBPkvdng0h+GIE5eu5aDSY+6n5pmp5rnEDA5DNtNb8xpi7b+uJd+BT+6nmz4OM3N0j3v8YAmFxxl59c0aUU8Ne3agfa7/fPQKOk9Y4ugSAS+2MJMPluOByecp0bPgT8bTGP+FSWGcWkPQYMlcAztnGdAuyZKkkcq6tVFyh6lV4h4N8NMfaAxRk8rfLBcRPT5vtK2r03a5ZDLu7mcx0XSxxYk0DKJlb+M1WNpHQQxeIR55vL9R2Em8uYE3NrlSrJYmuZsJJTXtsL8GEvveQKqNfbuBBG8mHA5SoGnvGbc3YodokEYbMh0CkcROJUnaiSULq3yXcwRQoD/Be9VDfdqlWWiVxKXDwxO+QpHAXt2oNXT6ki/TadvngH71oTcMVThQAA/QUykjvZ6tHA8yQ5WxJzJ5DJRgOHq8G0QymXl3b1yDJhPrzmTyDXfAF+a+v8P9+l/8r3J7HdKgFUltGGtV3RiYwNTNVprgRQHrXV37He8NgfR36YozUCqPFVSm65NMpVT+DESmjhN/HCl9FZDzKbe5G/SpyIy5zLddr1471RAnV/0LRGoNbunzOBGb7I5tO+LE5tYDM6ZH2gYsN9cem41W2IDQwjPFZ91DRNTwdM7Ook9K5EYwPlVwMPTMBm1w1I5DVTX6jJASzA5NbSAAktE62BJwzO4HU5TeuNNiMh1UFsa9l48+bNm7cq9gfmr6wmxprr4wAAAABJRU5ErkJggg==”
#还原成字节
bs = base64.b64decode(s)
with open(“不知道.png”, mode=“wb”) as f:
f.write(bs)
#base64的字符串本质是什么?
本质就是字节
ob混淆,内存爆破,花指令等比较麻烦
<html>
<script type="text/javascript">
// 创建Base64对象
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
// 定义字符串
var string = 'i am bobo!';
// 加密
var encodedString = Base64.encode(string);
alert(encodedString);
// 解密
var decodedString = Base64.decode(encodedString);
alert(decodedString);
script>
html>
解密