ハッシュ関数(函数)とは?

ここでは暗号学的ハッシュ関数について。

用途は?



*パスワードの保存方法として
*パスワードのチェクに
*ある要素(値など)が正しいか
*破損チェックなど

上記のような場面で使われます。

決まりごと


H(A) = H(A) であり、H(A) ≠ H(B) になります。
H(A) = N , NからAは復元(復号)できません。つまり一方向性関数。
また同じアルゴリズムの場合、基本は
len(H(A)) = len(H(B))です。
同じ長さが望ましい。
つまりlen(A) が120bitでlen(B)が200bitであったとしても、
len(H(A)) = len(H(B))このようにハッシュ関数の計算結果は元の長さに関係なく同じ長さになります。

同じアルゴリズムで長さが違うと、一方向性関数の特性を生かした使い方が無意味になる可能性があります(絶対とは言えない)
例えば len(H(string(AAAAA))) = 5で、len(H(string(AAA))) = 3となった場合、元の文字列の長さが、つまりキャラクターの数がわかってしまいます
わかると良くないかもしれません。 元の文字列のヒントになる可能性があるからです。

有名なアルゴリズム


ハッシュ関数の有名どころのアルゴリズム。

SHA(シャー シリーズ)
  • SHA-0
  • SHA-1
  • SHA-2
    • SHA-224
    • SHA-256
    • SHA-384
    • SHA-512
    • etc....
  • SHA-3(Keccak)
    • SHA3-224
    • SHA3-256
    • etc...


    MD(エムディー シリーズ)
    • MD2
    • MD4
    • MD5

    現在SHA-1などは非推奨であり、MD5なども望ましいとは言えません。
    SHA-256あたりが無難でしょう。

    SHA-2


    SHA-224やSHA-256、SHA-384、SHA-512などが分類されます。
    ここでの注意点として、SHA-384はSHA-3又は(SHA3)とは別物です。

    SHA-2のそれぞれを比較
    • SHA-224
    • 出力長 : 224 bit
      ビット長 : 32 * 8 = 256
    • SHA-256
    • 出力長 : 256 bit
      ビット長 : 32 * 8 = 256

      SHA-224とSHA-256は
      256 - 224 = 32
      つまり、SHA-224はSHA-256から32bit引いたビットの出力。

    SHA-512のそれぞれを比較
    • SHA-512
    • 出力長 : 512
      ビット長 : 64 * 8 = 512

    • SHA-512/224
    • 出力長 : 224
      ビット長 : 64 * 8 = 512

      512 - 224 = 288
      つまり、SHA-512から228bit引いたら出力。

    • SHA-512/256
    • 出力長 : 224
      ビット長 : 64 * 8 = 512

      512 - 256 = 256
      つまり、SHA-512から256引いたら出力。

    • SHA-384
    • 出力長 : 384
      ビット長 : 64 * 8 = 512

      512 - 384 = 128
      つまり、SHA-512から128引いたら出力。


    次回、実際にSHA-256を使ってみます。
    PythonでSHA-256