PHP 5.5 では、パスワード関数password_hash()
とpassword_verify()
. >5.3.7 には、この機能を追加するためのファイルもあります。
私の問題は、現在 debian パッケージ 5.3.3-7+squeeze14 を実行していることです。
この古いバージョンの PHP でこの機能を利用できるようにする方法はありますか?
ですから、始める前に、1 つはっきりさせておきます。私は問題のライブラリ (および 5.5 のパッチ) の作成者です。
そうは言っても、他の人が言及したことは絶対に正しいです。5.3.7 が最小バージョンである理由は、それ以前のすべてのバージョンの bcrypt 実装にバグがあり、ハイバイト文字 (コード ポイント >= 128) を使用したパスワードでエントロピーが失われる可能性があるためです。
これが、5.3.7 が最小バージョンである主な理由です。また、少なくとも 5.3.7 にアップグレードすることを強くお勧めしますが、できれば最新のバージョンにアップグレードすることを強くお勧めします (それほど古いバージョンではない多くの重大なセキュリティ問題が見つかりました)。
では、以前のバージョンで立ち往生している場合はどうすればよいでしょうか? ライブラリをフォークして$2y$
、$2a$
. それは少なくともあなたを働かせるでしょう。この方法で生成されたパスワードは、将来のバージョンで移植可能になります (ライブラリは古いcrypt()
パスワードを検証できるように設計されています)。
ただし、これを行わないことをお勧めします。新しいバージョンの PHP にアップグレードするだけです。それほど難しいことではありません ( dotdebからの deb パッケージがあり、それを実行できます)。
本当に古いバージョンに行き詰まっている場合は、このために設計されたライブラリを使用することをお勧めします。私のPasswordLibまたはPhPassのようなもの(ライブラリのリンクされたバージョンのみを使用する必要があることに注意してください。githubには他にもいくつかありますが、それらは大幅に異なります)。
5.3.7 が最小バージョンになった理由はcrypt()
、以前のバージョンの PHP で bcrypt を使用した関数が、現在のバージョンとは大きく異なる結果を出力するためです。
自分で結果を確認できます: http://3v4l.org/3cAZf
次のコードを使用します。
<?php
var_dump(crypt('rasmuslerdorf', '$2y$07$usesomesillystringforsalt$'));
string(60) "$2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi"
string(13) "$25di0cl7EYZA"
文字列(13) "$2v4FKr10WzJ2"
PHP >= 5.3.7 が必要です。これは、修正された bcrypt アルゴリズム2y
がそのバージョンに含まれているためです。以前の2a
アルゴリズムは、US-ASCII 範囲外のバイトを含むパスワードに対して壊れていました。
5.3.3-7+squeeze14 バージョンにもこの修正が含まれている可能性があります。ディストリビューションは通常、特定のバージョンにとどまりますが、セキュリティ修正をバックポートします (このようなもの)。
したがって、そのアルゴリズムが利用可能かどうかを確認する必要があります。利用できる場合は、password_compat を安全に使用できます。
パッケージの変更ログは少し不明確です。追加されたことには言及しています2x
が、追加されたかどうかについても言及していません2y
(おそらくそうでした)。