一、base64
(1). base64加密解密方法图示
方法 | 作用 | 参数 | 返回值 |
---|---|---|---|
b64encode | 将输入的参数转化为base64规则的串 | 预加密的明文,类型为bytes;例:b‘steve Jobs’ | base64对应编码的密文,类型为bytes;例:b’c3RldmUgSm9icw==’ |
b64decode | 将base64串解密回明文 | base64密文,类型为bytes;例:b’c3RldmUgSm9icw==’ | 参数对应的明文,类型为bytes;例:b’steve Jobs’ |
urlsafe_b64encode | 作用同b64encode,但是会将 ‘+‘替换成 ‘-’,将’/‘替换成’_’ | 同b64encode | 同b64encode |
urlsafe_b64decode | 作用同b64decode | 同b64decode | 同b64decode |
(2). base64加密解密代码演示
import base64
#无论是encode还是decode都需要字节串
s = b"steve_Jobs"
base64_bs = base64.b64encode(s) #base64加密字节串
print(base64_bs) #b'c3RldmVfSm9icw=='
decrypt_s = base64.b64decode(base64_bs) #base64解密字节串
print(decrypt_s) #b'steve_Jobs'
二、SHA-256
1.简述
SHA256 是安全散列(hash)算法的一种,hash加密解密算法有三大特点如下:
(1). 定长,即无论输入多长,加密后的输出长度恒定;
(2). 不可逆,加密后的信息不可逆推;
(3). 雪崩,只有原信息有稍微修改,加密输出都会发生巨大改变;
2.SHA256加密代码演示
import hashlib
sha_obj = hashlib.sha256() #创建sha256对象
s = b'steve Jobs' #欲加密的字节串
sha_obj.update(s) #添加欲加密(hash)的内容
#获取加密(hash)结果 (二进制显示)
# b'*\xb7\x93\xe1!\xe0\xc4c\x80\xcd\xba\x19\x87\xa0\xa5\xad
# \x9f\xc0GQ\xa0\xe8d\xc0s\xd3\xa9\x86p0q\x9f'
print(sha_obj.digest())
#获取加密(hash)结果 (十六进制显示)
# 2ab793e121e0c46380cdba1987a0a5ad9fc04751a0e864c073d3a9867030719f
print(sha_obj.hexdigest())
三、HMAC-SHA256
(1). 简述
HMAC-SHA256 是一种通过特别计算方式产生消息认证码的加密算法,使用了散列算法的同时结合了一个加密密钥;它可以用来保证数据的完整性,同时可以用来作为某个消息的身份验证。
(2). HMAC-SHA256加密代码演示
import hmac
#生成hmac对象
#第一个参数为加密的key,bytes类型,
#第二个参数为欲加密的串,bytes类型
#第三个参数为hmac的算法,指定为SHA256
hm = hmac.new(b'steve Jobs', b'123456', digestmod='SHA256') #获取hmac对象hm
#获取最终结果
#二进制展示
#b"\xf6/X=\xa7X\xfc\x1c,@\xc4\xf6\x18\x0c\x1f+\x0bX\x9fA\xbb\
#xfc\x9b\xb3\x03\xa3\xc9\xcc \xde\x1f'"
print(hm.digest())
#十六进制展示
#f62f583da758fc1c2c40c4f6180c1f2b0b589f41bbfc9bb303a3c9cc20de1f27
print(hm.hexdigest())
四、 JWT(json-web-token)
1.简述
JWT有三部分组成,如下:
(1). header
头部分,格式为字典,表明所使用的算法和token类别,代码演示如下:
#alg代表要使用的算法
#typ表明该token的类别 - 此处必须为 大写的 JWT
{'alg':'HS256', 'typ':'JWT'}
(2). payload
声明(加密)部分,分为公有声明与私有声明。对于公有声明,JWT提供了内置关键字用于描述常见的问题,此声明部分均为可选项,用户可根据自己需求按需添加key;对于私有声明,用户可根据自己业务需求,添加自定义的key;公共声明和私有声明均在同一个字典中,转成json串并用base64加密,声明部分代码演示如下:
{
'exp':xxx, #公有声明 Expiration Time 此token的过期时间的时间戳
'iss':xxx,#公有声明 (Issuer) Claim 指明此token的签发者
'aud':xxx, #公有声明(Audience) Claim 指明此token的签发群体
'iat':xxx, #公有声明 (Issued At) Claim 指明此创建时间的时间
'username': 'steve Jobs', #私有声明
'uid': '1' #私有声明
}
(3). signature
算法签名,用于加密算法更好加密解密
2.JWT加密解密手写代码演示
import copy
import time
import hmac
import json
import base64
class Jwt():
def __init__(self):
pass
@staticmethod
def b64encode(jstr_obj):
return base64.urlsafe_b64encode(jstr_obj).replace(b"=", b"")
@staticmethod
def b64decode(b_s):
rem = len(b_s) % 4
if rem > 0:
b_s += b"=" * (4 - rem)
return base64.b64decode(b_s)
@staticmethod
def encode(pyload, key, algorithm="HS256"):
header = {"alg": algorithm, "typ": "Jwt"}
header_jstr = json.dumps(header, sort_keys=True, separators=(",", ":"))
header_bs = Jwt.b64encode(header_jstr.encode())
my_pyload = copy.deepcopy(pyload)
my_pyload_jstr = json.dumps(my_pyload, sort_keys=True, separators=(",", ":"))
my_pyload_bs = Jwt.b64encode(my_pyload_jstr.encode())
str1_bs = header_bs + b"." + my_pyload_bs
if isinstance(key, str):
key = key.encode()
sign = hmac.new(key=key, msg=str1_bs, digestmod="SHA256")
sign_bs = Jwt.b64encode(sign.digest())
return str1_bs + b"." + sign_bs
@staticmethod
def decode(b_s, key,algorithm="HS256"):
if algorithm == "HS256":
header_bs, pyload_bs, sign_bs = b_s.split(b".")
if isinstance(key, str):
key = key.encode()
str_bs = header_bs + b"." + pyload_bs
new_sign = hmac.new(key=key, msg=str_bs, digestmod="SHA256")
new_sign_bs = Jwt.b64encode(new_sign.digest())
if sign_bs != new_sign_bs:
print("Hello")
pyload_jstr = Jwt.b64decode(pyload_bs)
pyload = json.loads(pyload_jstr)
exp = pyload["exp"]
if time.time() > exp:
#过期
raise
return pyload
else:
pass
if __name__ == "__main__":
exp = time.time() + 100
b_s = Jwt.encode(pyload={"username":"steve Jobs","exp":exp},key="123456",algorithm="HS256")
#对'{"username":"qiu"}'加密后的字节串:
#b'eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp3dCJ9.eyJleHAiOjE1ODQ1ODk3NzYuNTIxMDU4NiwidXNl
# cm5hbWUiOiJzdGV2ZSBKb2JzIn0.D3iI6a1ReuHSyDa1B0P5U8knY2k-MH0Wihim-5RCnJg'
print(b_s)
#解密后的内容
#{'exp': 1584591827.635661, 'username': 'steve Jobs'}
pyload = Jwt.decode(b_s,key="123456",algorithm="HS256")
print(pyload)
3.JWT加密解密原生代码演示
#jwt库安装:pip3 install pyjwt -i https://pypi.tuna.tsinghua.edu.cn/simple
import jwt
import time
exp = time.time() + 100
key = "123456"
payload = {"username":"steve Jobs","exp":exp}
#获取加密字节串
#b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWVybmFtZSI6InN0ZXZlIEpvYnMiLC
#JleHAiOjE1ODQ1OTE4NjkuMTY2Njk0fQ.bDjL7S08_-4JO_cRNYfsrVN8i-jDOoyHCWFTcBr7ssQ'
b_s = jwt.encode(payload=payload,key=key,algorithm="HS256")
print(b_s)
#获取解密字节串
#{'username': 'steve Jobs', 'exp': 1584591869.166694}
decrypt_s = jwt.decode(b_s,key=key,algorithms="HS256")
print(decrypt_s)