[TIL.38]パスワード-認証、承認


資格認定


プレイヤーIDとパスワードを確認するには
  • ログインプロセス
    1)ユーザーIDとパスワードの作成
    2)ユーザが暗号化されていない場合はDBに保存する.
    3)ユーザーログイン→ユーザー名とパスワードの入力
    4)ユーザが入力したパスワードを暗号化し,データベース内のユーザパスワードと比較する.
    5)一致した場合、ログインに成功
    6)ログイン成功後  クライアントにaccess tokenを送信します.
    7)ユーザログインが成功すると、  access tokenを添付し、ログインのたびにリクエストをサーバに送信します.
  • 1.パスワードパスワードは一般的に一方向ハッシュを使用します。


  • 一方向ハッシュ関数とは?
    元のメッセージを変換し、暗号化メッセージの要約を生成します.元の情報が分かれば簡単に暗号化された情報を得ることができるが,暗号化された情報は元の情報を得ることができないため,一方向性と呼ぶ.

  • 一方向ハッシュ関数の弱点を保護するために,通常2つの補足点がある.
    1) salting
    ハッシュ値を計算する方法は、実際のパスワードのほかにランダムなデータを追加することもできます.
    2) Key Stretching
    一方向ハッシュ値を計算し、ハッシュ値をハッシュし、ハッシュ値を繰り返します.
    ->キスストレッチは、一般的に1秒間に50億個以上のDigestが装備されていますが、Keyストレッチを使うと、同じ装備で1秒間に5回程度しか比較できません.
  • 2. Brypt


  • SaltingおよびKey Stretchingによって実現されるハッシュ関数の中で最も広く使用される.

  • 最初からパスワードを一方向に暗号化するために作成されたハッシュ関数.

  • bcryptはstringデータを暗号化するのではなく、byteデータを暗号化する.
    したがって,暗号化にはバイト化が必要である.
    すなわち、符号化はbytesであり、復号化はstrである.

  • Encode、decodeでは「UTF-8」Unicode文字仕様を使用して、私たちが認識できる形式に変換します.
  • 1)会員登録時にパスワードを保存する


    会員登録してパスワードを暗号化する場合はbcrypt.hashpw()を使用します.
    初めてプレイヤーがパスワードを作成するとstrになるので、byteに符号化されます.
    # bcrypt 설치
    pip install bcrypt
    
    import bcrypt
    
    hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
    
    # 비밀번호를 데이터에 저장할때는 decode해서 string 형태로 저장해주어야 한다.
    decode_hash_pw = hashed_password.decode('utf-8')
    パスワードを保存するときは、strに再復号して保存します.
    なぜそれを。。stringとして保存するのですか?
    暗号化(バイト)をデータベースに格納すると、bが加算されます.
    これにより,後でパスワードを登録して確認すると,bを含むstringタイプが再符号化されるので,パスワードの値はいっそ変更される.したがって、パスワードを保存するときは、バイトではなくstrタイプを使用する必要があります.
    =>バイトタイプで保存すると、このように表示されます.
    =>符号化を再復号してstr形態に変換する.

    2)ログイン時にパスワードを確認する


    ログイン時にデータベースに格納されているパスワードと比較して、bcrypt.checkpw()を使用します.
    bcrypt.checkpw(data['password'].encode('utf-8'),passwords.encode('utf-8'))
    ユーザが入力したパスワードを符号化し、記憶しているpasswordsに対しても符号化比較パスワードを行う.

    承認


    ユーザが要求を実行する権利のあるユーザであるかどうかを決定するプロセス.
    これらのステップはJWTによって実現できる.
    これは、ユーザがユーザ要求の要求を実行する権利があるかどうかを決定することを意味する.
    1)許可によりアクセストークンを生成する.アクセスポイントには、ユーザ情報を確認できる情報が含まれています.
    2)ユーザが要求を送信する場合、アクセスポイント送信を付加する
    3)サーバは,ユーザが送信したアクセストークンを復号する.
    4)復号データによりユーザIDを取得する.
    5)useridを使用して、そのユーザの権限をデータベースで確認します.
    6)ユーザーが十分な権限を持っている場合、その要求を処理する.
    7)ユーザに権限がない場合、401または他のエラーコードが送信される.

    JWT(JSON Web Tokens)

  • token生成方法
  • # pyjwt 설치
    pip install pyjwt
    
    import jwt
    
    
    if bcrypt.checkpw(data['password'].encode('utf-8'),passwords.encode('utf-8')):
    	token = jwt.encode({'id': User.objects.get(email=email).id}, 	SECRET['secret'], algorithm='HS256')
    	return JsonResponse({'token': token}, status=200)
    else:
    	return JsonResponse({'MESSAGE': 'NOT FOUND'}, status=404)

  • ユーザ情報を含むjsonデータを暗号化し,クライアントとサーバ間で交換する.
    ユーザーログインに成功するとtokenという暗号化されたユーザー情報が添付され、requestがユーザーに送信されます.

  • ログインに成功した場合jwt.encodeでトークンを作成し、フロントに送信すると、フロントはローカルストレージにトークンを格納します.
    このトークンの役割は,現局がタイトル部分でトークンを送信する際に,トークンによってバックエンドがどのようなプレイヤーであるかを探し出し,対応するデータをそのプレイヤーに公開または取得することである.
  • すなわち、上のtokenを解読すればuser idがわかる.