zoukankan      html  css  js  c++  java
  • 加密

    可逆加密

    # 可逆的加密解密
    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)
    
    
  • 相关阅读:
    经济--股票--深圳指数基金
    经济--年终奖理财攻略
    经济--股票--基金经理打死不肯说的赚钱黑幕
    经济--股票--基金定投
    经济--股票--基金分类的三个角度
    经济学--股票--必胜法则
    经济--降息对股市是好消息还是坏消息?
    PHP数组的排序函数
    使用回调函数处理数组的函数
    统计数组元素的个数和唯一性的函数
  • 原文地址:https://www.cnblogs.com/mqhpy/p/12129899.html
Copyright © 2011-2022 走看看