6

私は比較的成熟したオープンソースのPHPプロジェクトに貢献しています。最近、パスワードがプレーンなMD5ハッシュとして保存されていることを発見しました。これは、私にとって非常に面倒です。修正するならDoItRight(tm)もいいと思ったので、bcryptを使いたかった。

まず、私が他の言語で見つけたもの:bcrypt-rubyは、OpenBSDの元のCコードまたはjBCryptのJavaコードのいずれかを使用しているようです。 py-bcryptは、BSDコードの薄いラッパーです。 BCrypt.netはjBCryptの直接ポートです

現在、PHP自体はcrypt関数でbcrypt(誤解を招くように単に「blowfish」と呼ばれていますが)をサポートしています。ただし、5.3より前のバージョンでは、システム自体のサポートが必要です。これは通常、crypt_blowfishによって提供されます。 phpassも同じで、PHP5.3またはSuhosinのいずれかをインストールすることをお勧めします。

アプリケーションの多くのユーザーは標準の共有ホスティングを使用しているので、サーバーの特別な構成は必要ありません。PHPの5.3リリースからコードを盗むことを望んでいましたが、それはCであり、(私が行ったほんの少しの読みから)プロジェクトのユーザーにC拡張機能の使用を要求することはできません。

私はbcryptの純粋なPHPポートを作成することを考えましたが、jBCryptのソースを見ると、PHPとblowfishのどちらにも非常に精通しておらず、ここでの間違いが同時に発生する可能性があるため、そうすべきかどうかわかりません。そもそも危険で検出が難しい。

それで、私はあなたに2つの(マルチパート)質問を提示します:

  1. PHPの知識が不足しているので、私を最大限に活用できますか?すでに作成されている実装の1つを実際に使用できますか?
  2. 代わりに、構成可能な回数だけ呼び出すsha1()か、md5()繰り返し実行する単純なループ関数を作成する必要がありますか?
4

3 に答える 3

7

PHPの知識が不足しているので、私を最大限に活用できますか?すでに作成されている実装の1つを実際に使用できますか?

残念ながら、あなたは正しいです。5.3.0より前では、PHPはデフォルトでbcryptをサポートしていませんでした。代わりに、OSのサポートに依存していました(CRYPT_BLOWFISH定数を確認してください)。ご指摘のとおり、その場合はスホシンが選択肢となります。

代わりに、sha1()またはmd5()を構成可能な回数だけ繰り返し呼び出す単純なループ関数を作成する必要がありますか?

暗号化に関して最善のアドバイスは、「自分で作成しないでください」です。繰り返し電話をかけると、セキュリティが向上する場合と向上しsha1()ないmd5() 場合があります。

一方、bcryptの作成者は、このペーパーで設計上の決定について説明しています。

于 2010-08-23T23:34:43.777 に答える
1

残念ながら、PHP 5.3 を使用しているか、Suhosin 拡張機能を使用しているか、オペレーティング システムの bcrypt 実装で Blowfish がサポートされている場合を除き、Blowfish で bcrypt を使用することはできません。

したがって、この場合の最善の策は、SHA-256 または SHA-512 をキーストレッチ(およびもちろんソルト) とともに使用することです。しかし、セキュリティに関して言えば、独自のソリューションを展開することは決して良い考えではありません。

于 2011-08-12T08:02:05.807 に答える
0

触れなかったphpassの利点の1つは、CRYPT_BLOWFISHが使用できない場合、DESを使用し、最後にMD5を基になる暗号として使用するように自動的にフォールバックすることです。ラッパーは、md5実装でさえ、単純なハッシュよりもはるかに安全であるような方法でこれらを使用します。

于 2012-06-07T15:18:36.083 に答える