opensslコマンド、PHPのcrypt、password_hashを使ってハッシュ化されたパスワードの生成方法、不可逆

ITで知っておくべき知識
スポンサーリンク

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$で始まるか$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でハッシュ化してみます。

 

アルゴリズム(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という文字列をハッシュ化してみます。

 

PASSWORD_BCRYPT - CRYPT_BLOWFISH アルゴリズムを使ってハッシュを作ります。

これは標準の crypt() 互換のハッシュで、識別子 "$2y$" を使った場合の結果を作ります。

その結果は、常に 60 文字の文字列になります。

パスワードをハッシュ化する理由

パスワードをハッシュ化する理由として、第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで悪用されるのを防げるからです。

ハッシュ化されたパスワードは不可逆で戻せない

ハッシュ化されたパスワードは不可逆です。

ハッシュ値はハッシュ化の際に元データの情報を欠落させてしまう処理などがあり、元データに戻すことはできません。

 

一方で暗号化は、元データの暗号化や復号化に用いる鍵(キー)を入手できれば、元データへ戻すこと(復号化)が可能です。

 

コメント