2019-06-17【暗号化モジュール:itsdangerous】

2305 ワード

前に書く
プロジェクトをする時、ユーザーの登録は1つの検証の接続をユーザーに送る必要があって、検証の接続はユーザーの情報を携帯する必要があって、URLの中で直接ユーザー名あるいはユーザーidを明示的に表示することを避けて、一部のユーザーの悪意のある攻撃を防止して、itsdangerousを使ってユーザー名あるいはidに対して暗号化します
itsdangerous使用
  • itsdangerous
  • をインストール
    pip install itsdangerous
    
  • 暗号化情報
  • from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
    
    serializer = Serializer('secret', 3600)#     Serializer  ,secret        ,      ,3600     ,   s
    info = {'confirm': 1}
    token = serializer.dumps(info) #     ,  serializer_obj.dumps()  ,   bytes    
    token = token.decode() # bytes        utf-8,  decode  
    
    print(token)
    
    
    # eyJhbGciOiJIUzUxMiIsImlhdCI6MTU2MDc3MjYxNCwiZXhwIjoxNTYwNzc2MjE0fQ.eyJjb25maXJtIjoxfQ.8A_GU0nxqQuLMVmE6l5mAzno-LjsNWTMNAYm4i_WdTbg5bRtZwLk7vc6LpKRMkcfRYnK7vUo-DB7k_4daiVuXw
    
    
  • 復号情報
  • serializer = Serializer('secret', 3600)
    token = serializer.loads(token)
    print(token)
    
    
    # {'confirm': 1}
    
  • 期限切れ時間期限切れになってから復号するとエラーが発生します.エラータイプはSignatureExpiredです.次の図:
  • from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
    import time
    
    #   
    serializer = Serializer('secret',5)
    info = {'confirm': 1}
    token = serializer.dumps(info) #        bytes    
    token = token.decode() # bytes        utf-8,  decode  
    
    #   
    serializer = Serializer('secret',5)
    time.sleep(6)
    token = serializer.loads(token)
    
    
    # itsdangerous.exc.SignatureExpired: Signature expired
    

    itsdangerousユーザー登録でユーザー検証メールを送信する使用
    1、Djangoのプロファイルsettings.pyにSECRET_があるKEY,直接使用可能2、復号中にSignatureExpiredのエラーをキャプチャする必要がある
  • メールを送信する前に暗号化(一部コード表示):
  • 
    serializer = Serializer(settings.SECRET_KEY, 3600)
    info = {'confirm': user.id}
    token = serializer.dumps(info)#bytes
    token = token.decode()
    
    
  • メール送信後の復号化(一部コード表示):
  • serializer = Serializer(settings.SECRET_KEY, 3600)
    try:
        info = serializer.loads(token)
        #         id
        user_id = info['confirm']
        #   id      
        user = User.objects.get(id=user_id)
        user.is_active = 1
        user.save()
    
        #        
        return redirect(reverse('user:login'))
    except SignatureExpired as e:
        #        
        return HttpResponse('       ')