WordPress等ユーザー管理を行うデータベースのユーザーテーブルでは、ユーザー名とパスワードが保存されています。
このパスワードは当然、ハッシュ化されており解読は出来ません。
では、どうやってパスワードを生成しているのでしょうか?
openssl passwd コマンドでハッシュ化
最も簡単な方法は、openssl passwdコマンドを使ってパスワードを生成する方法です。
openssl passwdのオプションは次の通りです。
・https://www.openssl.org/docs/man1.1.1/man1/openssl-passwd.html
openssl passwdコマンドのオプションで大事なのは以下のオプションです。
-1:MD5アルゴリズムで暗号化。生成したパスワードは$1$で始まる。
-5:SHA256アルゴリズムで暗号化。生成したパスワードは$5$で始まる。
-6:SHA512アルゴリズムで暗号化。生成したパスワードは$6$で始まる。
※ opensslの最新バージョンでは、-5 や -6のオプションをサポートしていないようです。
実際にaaaという文字列をハッシュ化してみます。
1 2 3 4 5 6 7 8 9 10 |
$ openssl passwd -1 aaa $1$5AGV0fYj$bK3rJywS9qzRp0IGCaO4U/ $ openssl passwd -5 aaa $5$NWWPlwTR7qt7f8rS$FfPeUe5FOnL9CojRKYZuGYY5uVDw/oYPSSh2/drkh5C $ openssl passwd -6 aaa $6$ETraq8S.rw0hfaLG$2Fgqeb8xG4oOLmdk3td.j3hsOULV2oYSzkQkoUq.FTB3YybibfarFuLxJ0V9Ku.cZ.Y4yp2tcRX.4HD9NG/RB1 |
$1$で始まるか$5$で始まるか$6$で始まるかで、どのハッシュ化アルゴリズムでハッシュ化されたかは判別可能です。
PHPのcrypt関数
同様なことは、PHPのcryp関数で行うことも可能です。
crypt関数がサポートしているハッシュアルゴリズムのは次の通りです。
・https://www.php.net/manual/ja/function.crypt.php
アルゴリズム | 説明 |
---|---|
CRYPT_SHA256 | SHA-256のハッシュ関数を使用。 $5$ で始まり、コストパラメータと 16 文字の salt よりハッシュ値を生成。 |
CRYPT_SHA512 | SHA-512のハッシュ関数を使用。 $6$ で始まり、コストパラメータと 16 文字の salt よりハッシュ値を生成。 |
CRYPT_BLOWFISH | Blowfish暗号を使用。 $2a$、$2x$、$2y$のいずれかで始まりコストパラメータと 22 文字のsaltよりハッシュ値を生成。 |
CRYPT_MD5 | MD5のハッシュ関数を使用。 $1$ で始まり 8 文字の salt を使いハッシュ値を生成。 |
CRYPT_STD_DES | 標準の DES暗号を使用。 2 文字の salt を使いハッシュ値を生成。 |
CRYPT_EXT_DES | 拡張した DES 暗号を使用。 アンダースコアから始まる9文字の salt を使いハッシュ値を生成。 |
crypt()関数を使って、コマンドラインからaaaという文字列をCRYPT_SHA256でハッシュ化してみます。
1 2 |
$ php -r 'var_dump(crypt("aaa", "\$5\$rounds=5000\$1234567890123456"));' string(75) "$5$rounds=5000$1234567890123456$Ndedp2KUwrLLGWzscwirLEcepwlYmX3v/0eshPIw7L1" |
アルゴリズム(SHA-256):5
ハッシュループの実行回数:rounds=5000
ソルト:1234567890123456
生成されたハッシュ値:Ndedp2KUwrLLGWzscwirLEcepwlYmX3v/0eshPIw7L1
PHPのpassword_hash関数
PHPのpassword_hash() は crypt() のシンプルなラッパーであり、既存のパスワードハッシュと互換性があります。
PHPのマニュアルではpassword_hash() を使うことを推奨しています。
・https://www.php.net/manual/ja/function.password-hash.php
password_hash()関数を使って、コマンドラインからaaaという文字列をハッシュ化してみます。
1 2 |
$ php -r 'var_dump( password_hash("aaa", PASSWORD_BCRYPT));' string(60) "$2y$10$VTqViX7haJ3R7yAF54CnGuEaltLYOzu05JD8IP.xxVDr7YzJS6W92" |
PASSWORD_BCRYPT - CRYPT_BLOWFISH アルゴリズムを使ってハッシュを作ります。
これは標準の crypt() 互換のハッシュで、識別子 "$2y$" を使った場合の結果を作ります。
その結果は、常に 60 文字の文字列になります。
パスワードをハッシュ化する理由
パスワードをハッシュ化する理由として、第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで悪用されるのを防げるからです。
ハッシュ化されたパスワードは不可逆で戻せない
ハッシュ化されたパスワードは不可逆です。
ハッシュ値はハッシュ化の際に元データの情報を欠落させてしまう処理などがあり、元データに戻すことはできません。
一方で暗号化は、元データの暗号化や復号化に用いる鍵(キー)を入手できれば、元データへ戻すこと(復号化)が可能です。
コメント