IL - Bcrypt & JWT


Bcrypt


Bcryptを理解するには,まずハッシュ関数を理解する必要がある.
ハッシュ関数は、任意の長さのデータを固定長のデータにマッピングする関数であり、もともとはデータを迅速に検索するための関数であった.
ハッシュ関数には、ハッシュの結果値が元の値(元のデータ)から抽出できない(一方向ハッシュ関数)という特徴がある.
encryptとは異なりハッシュは単一リダイレクトであるため,鍵の有無にかかわらず復号後の値を復号し,元の値を知ることができず,ハッシュ関数により復号後の値を要約(digest-元の値を知ることができないためdigestと呼ぶ)に消化する.
このようにデジェストはぐるぐる囲まれていて、元の値段が分からないので安全に見えますが、事実はそうではありません.Rainbowテーブルが存在するからこそ、Rainbowテーブルはハッシュ関数で生成できる値を大量に格納したテーブルであり、brootforce攻撃によってユーザのパスワードを見つけたり、要約を平文として解釈したりするために存在する.これらのハッシュされた情報は、これらのレインボーテーブルを介して簡単に透過される可能性が高いため、代替案を探さなければなりません.
Rainbowテーブルなど(計算の発展によるBrook Forceの速度増加などを含む)に対抗するために,SaltingとKey-stretchingを用いることができる.

Salting


saltingはその名の通り塩を打つことであり,ハッシュ関数に元のデータを入れる前に任意の文字列(データ)を追加してハッシュすることを意味する.
たとえば、パスワードが「asdfasdf」の場合、任意の文字列(「asdfaswfoinw 3 vjljdil」)をsalt値で貼り付けて「asdfasdfasdfasdfasdfaswfoinw 3 vjljdil」としてsush関数に入れます.これにより,手帳を用いて元のデータを検索しても,重要なデータ(元のデータ)とは何か,saltとは何かを知ることができないため,より安全である.また、saltは任意の文字列を使用するため、Rainbowテーブルには対応する要約(saltを追加してハッシュする要約)がない確率が高いため、元のデータを推定する時間が長くなる.

Key-Stretching


これはSaltingとHash暗号化の欠点を補うために作成されたものであり,単純なHash関数(Hash関数)によって繰り返し行われる.例えば、Aという名前のデータを復号してBという名前の要約を得た場合、再びBを復号してCという名前の要約を保存する.もちろん,開発者自身のみが繰返し回数を知っているのが最良であるが,攻撃者がハッシュ関数を迂回した回数を知っていても,最終要約の原文値を知るためにかかる時間が長くなり,かなり困難になる.

Salting & Key-Stretching


私たちのパスワードをより安全に保存するためには、上記の方法をよく利用しなければなりません.最善の方法はSaltingとKey-stretchingを繰り返し使用することです.保存と復号化後、パスワードを安全に暗号化しながら、保存と復号化を繰り返すことができます.
もちろん,この方法は無条件で安全ではなく,計算の進展(GPU演算速度の向上)などに伴い,再び旧時代の暗号化方式ほど安全ではない可能性がある.
Hash関数のセキュリティを向上させるために、いくつかの簡単な方法を使用してHash関数のセキュリティを向上させ、それらを使用してパスワードを簡単に暗号化しました.これがBcryptです.
Bcryptは任意のSaltを自動的に生成し,キーを押すことでパスワードを暗号化し,ハッシュ関数,キー,キーの正確な原理を知らなくても暗号化を用いることができる.

Bcrypt example


ではBcryptを使いましょう
まずインストールします.
pip install bcrypt
簡単に設定できます.
test.pyのPythonファイルを開いてテスト
import bcrpyt

password = '1234'
encoded_password = password.encode('utf-8')
print(encoded_password) # b'1234'

hashed_password = bcrypt.hashpw(encoded_password, bcrypt.gensalt())
print(hashed_password) # b'~~~~~' salt가 랜덤값이라 값은 다 다를것이다.
に示すように、コードを作成して実行すると、ハッシュ(暗号化)パスワードが表示されます.
ここでbcryptgensalt()は、bcryptがランダムに生成したsalt値、bcryptである.gensalt()を印刷すると、他の値が生成され続けることがわかります.その関数ではなくsalt値を入力すると、salt値として保存できますが、これは固定値なので推奨されません.
こんな簡単なbcryptハッシュ暗号化はhashpw(平紋,bcrypt.gensalt()を使用して行うことができる.ただし、Bcryptには、入力値として72バイトの文字を使用する必要があるという制限があります.

JWT


(なに?JMTかな?)

JWTはJSON Web Tokenであり、通常、クライアントとサーバ、サービスとサービスとの間で通信を行う際に認証を行うために使用される.URLでも使えるように作られたURL-Safeは、主にRequestのHeaderに含まれています.

こうぞう


JWTはdot(.)3つの部分からなり、それぞれヘッダ、ペイロード、およびフラグと呼ばれる.誰もが自分の必要な情報を持っています.内容は以下の通りです.
  • Header:トークンタイプとハッシュアルゴリズムに関する情報を含む.」type"属性にはタグの属性(JWT)が含まれ、"alg"属性にはハッシュ用のアルゴリズム情報が含まれ、このアルゴリズムで署名とタグを検証します.
  • Payload:トークンに入れるClaim情報を含み、Payloadの情報の一部をClaimと呼ぶ.Claimはkey/value pairからなり、複数のセグメント(claim)を含むことができる.
    Claimには次のものがあります.
    トークン情報を表すデータ型が決定されたターゲットを登録します.
    Public Claim(カスタムClaimは情報公開用、URI形式は衝突防止用).
    ≪プライベート・ターゲット|Private Targets|emdw≫(カスタム・ターゲットを使用してサーバとクライアントの間に指定した情報を格納します)
    3種類あります.
  • 信号:Secret Keyを含む暗号化.ヘッダとペイロードは暗号化されていません.JSON文字列をbase 64に符号化するだけです.この値を再符号化すると、JSONに何が含まれているかを決定できます.トークンを使用する場合、そのトークンは他の人に偽造されないため、データが偽造されているかどうかを検証する部分は署名部分である.タイトルとペイロード部分.接続先はalg,secret key符号化で生成される.
  • JWTの利用


    JWTは、主にログイン状態を通知する役割を果たしており、ページを移動するたびにログインできないため、ログインを行うクライアントはトークンを持ってページを移動し、必要なデータを要求するとともに、JWTトークンを承認(認可)に一斉に送信するプロセスである.JWTを交換するプロセスは次のとおりです.
  • クライアントは、サーバにアイデンティティとパスワードのログイン要求を発行します.
  • サーバは、アイデンティティとパスワードをデータベースと比較し、一致するとトークンが渡され、失敗するとエラーメッセージが渡されます.
  • トークンを受信したクライアントは、要求が必要な場所でサーバにトークンを送信し、サーバが有効であることを検証した後、必要な情報を返す.
  • このようなプロセスによって承認され、トークンはクレームセットを暗号化しないという特徴があります.したがって、署名がなければ、誰もが原文にアクセスできるので、セキュリティに重要な情報を含めることはできません.すなわち、user−idなどのユーザのセキュリティに敏感でない最小情報のみを含むべきである.