加密

可逆加密

# 可逆的加密解密
import base64
s = 'abc'

# 加密
s1 = base64.b64encode(s.encode())
print(s1)

# 解密
s2 = base64.b64decode(s1).decode()
print(s2)

不可逆加密

import hashlib

# 盐
SECRET_KEY = 'm#mh1=hyrj=wgqgz)x%@!c9^jg%@sv9iqcsrh7k-*#1u)jg0un'

# 加密
s3 = hashlib.md5(s.encode())
s3.update(SECRET_KEY.encode())
print(s3.hexdigest())

n_s = 'abc'
n_s3 = hashlib.md5(n_s.encode())
n_s3.update(SECRET_KEY.encode())
#进行碰撞让两个加密相等
print(s3.hexdigest() == n_s3.hexdigest())

封装加密

from rest_framework import serializers
from rest_framework.serializers import ModelSerializer, ValidationError
from . import models
from django.contrib.auth import authenticate
class LoginModelSerializer(ModelSerializer):
    # username和password字段默认会走系统校验,而系统的post请求校验,一定当做增方式校验,所以用户名会出现 重复 的异常
    # 所以自定义两个字段接收前台的账号密码
    usr = serializers.CharField(write_only=True)
    pwd = serializers.CharField(write_only=True)
    class Meta:
        model = models.User
        fields = ('usr', 'pwd')
    def validate(self, attrs):
        usr = attrs.get('usr')
        pwd = attrs.get('pwd')
        try:
            user_obj = authenticate(username=usr, password=pwd)
            if not user_obj:
                raise ValidationError({'user': '用户不存在'})
        except:
            raise ValidationError({'user': '提供的用户信息有误'})

        # 拓展名称空间
        self.user = user_obj
        # 签发token
        self.token = _get_token(user_obj)

        return attrs


# 自定义签发token
# 分析:拿user得到token,后期还需要通过token得到user
# token:用户名(base64加密).用户主键(base64加密).用户名+用户主键+服务器秘钥(md5加密)
# eg: YWJj.Ao12bd.2c953ca5144a6c0a187a264ef08e1af1

# 签发算法:b64encode(用户名).b64encode(用户主键).md5(用户名+用户主键+服务器秘钥)
# 校验算法(认证类)与签发算法配套
"""
拆封token:一段 二段 三段
用户名:b64decode(一段)
用户主键:b64decode(二段)
碰撞解密:md5(用户名+用户主键+服务器秘钥) == 三段
"""
def _get_token(obj):
    import base64, json, hashlib
    from django.conf import settings
    t1 = base64.b64encode(json.dumps({'username': obj.username}).encode()).decode()
    t2 = base64.b64encode(json.dumps({'pk': obj.id}).encode()).decode()
    t3_json = json.dumps({
        'username': obj.username,
        'pk': obj.id,
        'key': settings.SECRET_KEY
    })
    t3 = hashlib.md5(t3_json.encode()).hexdigest()
    return '%s.%s.%s' % (t1, t2, t3)

原文地址:https://www.cnblogs.com/mqhpy/p/12129899.html