yano3nora
10/24/2017 - 12:36 PM

[php: hash] Generate hash on PHP. #php #security

[php: hash] Generate hash on PHP. #php #security

OVERVIEW

hash() で生成する HASH アルゴリズムの特徴について。

References.

  • Hash関数まとめ(md5, sha1, sha2, crc32, PBKDF2)
    • md5: bit128 / 32桁 / もはや脆弱でパスワードハッシュに不適当
    • sha1: bit160 / 40桁 ソルト付きなら PW ハッシュ OK みたい → 近年 sha2 への移行勧告あり
    • sha256: bit256 / 64桁 / sha2 の一種、最近はこっちに主流が移りつつある
    • sha512: bit512 / 128桁 / sha2 の一種で 64 bit CPU を想定して作られている
    • PBKDF2: sha2 系の重ね掛けアルゴリズムでセキュアめみたい
  • Random PW Generator

Sample code.

とりあえずハッシュ作りたい

echo md5(uniqid(mt_rand(), true)).PHP_EOL;
// e0d0e5b3e962afdc6c6f6488c17c537b

echo sha1(uniqid(mt_rand(), true)).PHP_EOL;
// 260de8f45b0e471714f71531ddf7b121e3968fd1

echo hash('sha256', uniqid(mt_rand())).PHP_EOL;
// 2bd0ee8b10042b56018e734548e1b508bff197d0e22a068ede55af252bebf7c5

パスワードのハッシュにはソルト必須?

アルゴリズムを変えたところで ハッシュは総当たりでクラックされる可能性がある 。どのアルゴリズムも 平文パスワードを純粋にハッシュするだけでは脆弱 なので、元のデータにデータを追加する「ソルト」付けや、このソルト生成にハッシュを組み合わせる「ソルトアンドペッパー」を行うのが定石とされる。(まぁほとんどフレームワーク側で担保してるけどね)

$password = 'this1sPassW0rd';
$salt     = 'SecuritySalt';
$pepper   = hash('SHA256', 'AndPepper');
$hashedPw = hash('SHA256', $pepper.$password.$salt);