暗号化→一方向


1.一方向ハッシュ関数


ユーザパスワードを暗号化する場合、通常は一方向ハッシュ関数が使用されます.
名前から,一方向ハッシュ関数は復号できない暗号化アルゴリズムであることがわかる.
すなわち,ユーザのパスワードをデータベースに格納した場合,復号化の目的では格納されない.
元のパスワード値が全く分からないようにするためです.
  • test passwordhash256一方向ハッシュ関数を使用すると0b47c68b1.....094eの値が得られます.
  • また、ハッシュ値(暗号化値)は元のパスワード値testpasswordで復号できない.
  • したがって、元のメッセージが分かると暗号化メッセージを取得することができるが、暗号化メッセージは元のメッセージを取得できないため、단방향성と呼ばれる.

  • 1.1 Pythonで実現

    import hashlib
    
    m = hashlib.sha256()		# sha256 알고리즘 선택
    m.update(b"test password")	# 바이트 값 입력
    m.hexdigest()				# 암호화된 값을 hex(16진수) 값으로 읽어 들인다.
    
    0b47c68b1.....094e

    2.ハッカー...セキュリティ


    ハッシュ関数


    ハッシュ関数はもともとパスワードを格納するために設計されたものではなく,短時間でデータを検索するために設計されたものであるため,速度が速い.
    dict、set資料構造でハッシュを使用します.
    従って,ハッシュ関数は本来,処理速度を最大化するように設計されている.

    脆弱性セキュリティ


    一方向ハッシュ関数は、虹攻撃と呼ばれるハッカーメソッドによって侵入される可能性もあります.
    これらのハッカーの脆弱性を保護するために、通常は2つの補足ポイントが使用されます.
    1. salting
    2. key stretching

    2.1 salting


    ハッシュ値を計算する方法は、実際のパスワードのほかにランダムなデータを追加することもできます.
    本来パスワードにランダム値を付けてハッシュするので、ハッカーに侵入されてもハッカーは実際に
    どの部分が実際のパスワード値で、どの部分がランダム値なのか分かりません.
    したがって、rainbow attackのようにハッシュ値を事前に計算することができ、ハッカー攻撃を無効にすることができる.

    2.2 key stretching


    従来の一方向ハッシュアルゴリズムの実行速度が速すぎるという欠点を補うために、
    一方向ハッシュ値を計算した後、再びハッシュ値をハッシュし、その値を複数回繰り返す方法は키 스트레칭(key stretching)である.
    すなわち、ハッシュ関数を複数回適用してハッシュ値を計算する.一般的なデバイスは、毎秒50億個以上のハッシュ関数を実行することができる.
    キーストレッチを適用すると,同じ装置では毎秒5回程度しか行えない.GPUを使っても数百~数千回しか運転できません.
    これは50億回に比べて非常に少ない回数だ.コンピュータのパフォーマンスが向上するにつれて、ハッシュを繰り返し実行する回数を追加し続けることができます.
    補うことができる長所がある.

    3. bcrypt


    saltingとkeystretchingを実現するハッシュ関数で最も広く用いられているのはbcryptである.
    bcryptは,最初からパスワードを一方向に暗号化するために作成されたハッシュ関数である.
    従って、認証エンドポイントを実現する際には、bcryptアルゴリズムが一般的に用いられる.

    3.1インストール

    pip install bcrypt

    3.2使用

    import bcrypt
    
    bcrypt.hashpw(b"secrete password", bcrypt.gensalt())  # hashpw("비번", "salt값")
    bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex()  # 16진수로 값을 본다.