PHPでのパスワード暗号化:SHA-256・SHA-512を使ったcrypt()関数の活用方法
PHPにおけるパスワード暗号化の基本
PHPでパスワードを安全に保存する際には、crypt() 関数を使ったハッシュ化が広く知られています。ただし注意が必要なのは、Blowfish アルゴリズムには PHP 5.3.7 より前のバージョンで脆弱性が確認されているという点です。そのため、該当バージョン以前の環境では、SHA-256 または SHA-512 を使用することが推奨されます。
SHA-256 と SHA-512 は、Blowfish とよく似たソルト形式を採用しています。具体的には、SHA-256 を使う場合は接頭辞として「$5$」を、SHA-512 を使う場合は「$6$」をソルトの先頭に付けます。さらに、これらのアルゴリズムにはオプションの rounds(ラウンド)パラメータが用意されており、ハッシュ処理を複数回繰り返して計算コストを高めることで、ブルートフォース攻撃への耐性を強化することも可能です。
ソルトの長さは Blowfish よりやや短い16文字ですが、Blowfish と異なり、英数字だけでなくそれ以外の文字もソルトとして利用できるという柔軟さがあります。
サンプルコード
echo 'SHA-256 (no rounds): ' . crypt('password-to-encrypt', '$5$YourSaltyStringz$');
echo 'SHA-512 (with rounds): ' . crypt('password-to-encrypt', '$6$rounds=1000$YourSaltyStringz$');実行結果
上記のコードを実行すると、次のような出力が得られます。
SHA-256 (no rounds): $5$YourSaltyStringz$td0INaoVoMPD4kieVrkGE67siKj3N8.HSff8ep0Ybs8
SHA-512 (with rounds): $6$rounds=1000$YourSaltyStringz$A5UHscsEbSnPnaV6PmSF5T/MQK.Wc3klA.18c.gXG5pD0PVYSVr/7xwRu1XJyn8XpiMDNRTvpJm5S8DkmSywz1
Blowfish と同様に、生成されたハッシュ文字列の中にはソルトが含まれています。この仕組みのおかげで、データベースにはハッシュ値だけを保存しておけばよく、認証時の照合にも同じ crypt() 関数をそのまま使えるため、ソルトを別途管理する手間が省けます。
補足:モダンなPHPでは password_hash() が推奨
なお、PHP 5.5 以降の環境では、crypt() を直接呼び出す代わりに、より安全で扱いやすい password_hash() 関数の使用が公式に推奨されています。password_hash() はソルトの自動生成やアルゴリズムの選択を内部で適切に行ってくれるため、実装ミスによるセキュリティホールの発生を防ぐことができます。レガシー環境との互換性が必要な場合のみ、本記事で紹介した crypt() + SHA-256/SHA-512 の手法を活用するとよいでしょう。
-
【初心者向け】PHPタグとは?基本構文からショートタグまで徹底解説
PHPタグとは?定義と基本的な使い方PHPスクリプトは、拡張子が「.php」のテキストファイルとして作成され、Webサーバー上に保存されます。サーバー上のPHPパーサーは、<?php(開始タグ)と?>(終了タグ)という特殊な文字列を探し出します。この2つのタグは「PHPタグ」と呼ばれ、その間に記述されたステートメントのみがパーサーによって解釈・実行されます。PHPタグで囲まれたコードは、HTMLドキュメントの中に自由に埋め込むことができます。埋め込まれたPHPコードはサーバー側で実行され、その処理結果だけが出力されるため、残りのHTML部分はクライアントのブラウザーにあるHTMLパ
-
PHPのpi()関数とは?使い方と定義済み定数との対応を実例付きで解説
pi()関数の定義と使い方PHPのpi()関数は、数学定数π(円周率)の値を返す関数です。戻り値はfloat型の「3.14159265359」であり、PHPにあらかじめ定義されている定数M_PIとまったく同じ値になります。構文pi ( void ) : floatパラメータこの関数は引数を受け取りません。引数なしでそのまま呼び出すことができます。戻り値pi()関数は数学定数πの値を返し、定義済みの数学定数M_PIと等価です。数式の中では、M_PIの代わりにpi()関数を使うこともできます。対応するPHPバージョンこの関数はPHP 4.x、PHP 5.x、PHP 7.xのすべてのバージョンで利用