12

PHP 5.5 ではパスワード関数password_hash()password_verify(). >5.3.7 には、この機能を追加するためのファイルもあります。

私の問題は、現在 debian パッケージ 5.3.3-7+squeeze14 を実行していることです。

この古いバージョンの PHP でこの機能を利用できるようにする方法はありますか?

4

3 に答える 3

28

ですから、始める前に、1 つはっきりさせておきます。私は問題のライブラリ (および 5.5 のパッチ) の作成者です。

そうは言っても、他の人が言及したことは絶対に正しいです。5.3.7 が最小バージョンである理由は、それ以前のすべてのバージョンの bcrypt 実装にバグがあり、ハイバイト文字 (コード ポイント >= 128) を使用したパスワードでエントロピーが失われる可能性があるためです。

これが、5.3.7 が最小バージョンである主な理由です。また、少なくとも 5.3.7 にアップグレードすることを強くお勧めしますが、できれば最新のバージョンにアップグレードすることを強くお勧めします (それほど古いバージョンではない多くの重大なセキュリティ問題が見つかりました)。

では、以前のバージョンで立ち往生している場合はどうすればよいでしょうか? ライブラリをフォークして$2y$$2a$. それは少なくともあなたを働かせるでしょう。この方法で生成されたパスワードは、将来のバージョンで移植可能になります (ライブラリは古いcrypt()パスワードを検証できるように設計されています)。

ただし、これを行わないことをお勧めします。新しいバージョンの PHP にアップグレードするだけです。それほど難しいことではありません ( dotdebからの deb パッケージがあり、それを実行できます)。

本当に古いバージョンに行き詰まっている場合は、このために設計されたライブラリを使用することをお勧めします。私のPasswordLibまたはPhPassのようなもの(ライブラリのリンクされたバージョンのみを使用する必要があることに注意してください。githubには他にもいくつかありますが、それらは大幅に異なります)。

于 2012-09-17T14:22:28.330 に答える
5

5.3.7 が最小バージョンになった理由はcrypt()、以前のバージョンの PHP で bcrypt を使用した関数が、現在のバージョンとは大きく異なる結果を出力するためです。

自分で結果を確認できます: http://3v4l.org/3cAZf

次のコードを使用します。

<?php
var_dump(crypt('rasmuslerdorf', '$2y$07$usesomesillystringforsalt$'));

5.3.7 ~ 5.3.16、5.4.0 ~ 5.4.6 の出力

string(60) "$2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi"

4.3.0 - 4.3.11、4.4.0 - 4.4.9、5.0.0 - 5.0.5、5.1.0 - 5.1.6、5.2.0 - 5.2.17、5.3.2 - 5.3.6 の出力

string(13) "$25di0cl7EYZA"

5.3.0 ~ 5.3.1 の出力

文字列(13) "$2v4FKr10WzJ2"

于 2012-09-17T13:27:14.043 に答える
5

PHP >= 5.3.7 が必要です。これは、修正された bcrypt アルゴリズム2yがそのバージョンに含まれているためです。以前の2aアルゴリズムは、US-ASCII 範囲外のバイトを含むパスワードに対して壊れていました。

5.3.3-7+squeeze14 バージョンにもこの修正が含まれている可能性があります。ディストリビューションは通常、特定のバージョンにとどまりますが、セキュリティ修正をバックポートします (このようなもの)。

したがって、そのアルゴリズムが利用可能かどうかを確認する必要があります。利用できる場合は、password_compat を安全に使用できます。

パッケージの変更ログは少し不明確です。追加されたことには言及しています2xが、追加されたかどうかについても言及していません2y(おそらくそうでした)。

于 2012-09-17T13:27:54.053 に答える