PHP の「password_hash」を用いた時のハッシュ文字列の種類は何でしょうか? (「半角大文字と小文字のアルファベット」と「半角数字」と「.」と「$」かなと思うのですが...違うでしょうか?)


// 使用例
$options = ['cost' => 12];
$hash = password_hash($pass, PASSWORD_BCRYPT, $options);

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2018/06/28 12:14:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:psne No.1

回答回数605ベストアンサー獲得回数334

ポイント300pt

password_hashから返却される値の出現する文字列の範囲は

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

のようです。
この範囲外の文字列、例えば「"'」などのコード内に含めると都合の悪いコードや「❔」といったマルチバイト文字・絵文字は出現しないものになります。

正確な範囲を確認するにはソースコードを読むことが望ましいですが、ちょっとしたコードを書いて検証する事もできます。
(処理速度を調べるコードに一工夫をして、確認するコードを追加してみましょう。)


PHP5.3.2にて SHA-256 および SHA-512 が追加された際の説明に、実装の基となったものが紹介されています。
PHP: crypt - Manual

GitHubにてソースコードを検索することもできます。
php/php-src - GitHub

id:a-kuma3

https://github.com/php/php-src/blob/master/ext/standard/password.c#L477

hash_format_len = snprintf(hash_format, sizeof(hash_format), "$2y$%02" ZEND_LONG_FMT_SPEC "$", cost);

↑が頭につくみたいなので、"$" も入ります。

2018/06/27 23:25:44
id:tsuka115

どうもありがとうございます。

超泥臭く1000回テストしてみて 出現した文字は下記でした。
$/.0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

なお質問の中の「使用例」以外の設定で行ったら違うかもです。

2018/06/28 12:12:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません