• 加密


    可逆加密

    # 可逆的加密解密
    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)
    
    
  • 相关阅读:
    SpringBoot与quartz集成
    SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证
    搭建Redis集群和MySQL主从同步
    scanf_s读取键盘输入字符串失败
    含有通配符*的字符匹配(C语言)
    人之患
    TCP socket编程记录(C语言)
    程序变量命名规范(个人)
    h lib dll文件相关部分
    关于inet_ntop、inet_pton中的n和p分别代表的意义
  • 原文地址:https://www.cnblogs.com/mqhpy/p/12129899.html
Copyright © 2020-2023  润新知