私はセキュリティの専門家ではないので、そのようなふりをしないで、ここで質問します。私は多くのPHPベースのアプリケーションを書いており、今までbcryptを使用してパスワードをハッシュしています。
Scryptのウェブサイトはbcryptより4000倍遅いと主張していますが、この主張は本当に正しいのでしょうか?もしそうなら、安全性を重視する開発者にとって、bcryptの代わりにscryptを使用するように切り替える方が「良い」でしょうか?
Scryptはbcryptよりも「優れている」と思われますが、はるかに新しいものでもあり、それは悪いことです(「より新しい」は本質的に「より少ない監視を受けている」ことを意味するため)。
これらすべてのパスワードハッシュスキームは、単一のパスワードの処理をより高価な攻撃者にとってにしようと試みますが、あまり高価にしないサーバーに対して。サーバーは基本的にPCであり、攻撃者は自分のタスクに最も効率的なハードウェアを選択できるため、パスワードハッシュスキームは、それらに最適なプラットフォームがPCになるように試みます。 PBKDF2はGPUで完全に最適化できますが、bcryptとscryptはGPUにあまり適していません。 Bcryptとscryptはどちらも fast RAM を必要とします。これは、GPUの希少なリソースです(GPUは大量のRAMを持つことができますが、すべてのコアから同時にアクセスすることはできません)。
最近の [〜#〜] fpga [〜#〜] 多くの小さなRAMブロックを埋め込むと、bcryptで並列辞書攻撃を最適化するのに非常に便利です。これは、攻撃者が1000 $相当の汎用PCではなく、1000 $相当のFPGAを使用することにより、大幅なブーストを取得することを意味します。これは、回避したい種類のブーストです。 PCについては多く(ここでは数メガバイトしか話していない)、FPGAの使用を困難にするのに十分です(質問の詳細な扱いについては この答え を参照してください)。
したがって、理論的には、scryptはbcryptよりも優れているはずです。 ただし、これはすべて、scryptがその暗号化の約束を守るかどうかに左右されます。この種の堅牢性の保証は、時間をかけてのみ達成することができます。このスキームは、暗号技術者による長年の執拗な攻撃に耐えさえすれば、安全であると見なされます。どれだけの時間が必要か、もちろん少し主観的であり、そしてまたexposureに大きく依存します(スキームがより広くデプロイされるほど、それを壊すという点でターゲットがより「興味深い」ものになります。加害者の学術的名声を増加させる;したがって、より多くの精査を引き付ける。私自身の経験則では、公開後約5年間待つことです。つまり、scryptの場合は2014年です。
availabilityの問題もあります。関数を使用する場合、使用するプログラミングフレームワークに挿入できる実装が必要です。
私は、「ScryptはBCryptより4000倍遅い」というアサーションを1粒の塩でとります。まず、これらのアルゴリズムはどちらも複雑で複雑です。その「4000x」の数値が当てはまる場合でも、キーの派生にさらに11ラウンドを追加することで、BCryptを同じくらい遅くすることができます。次に、ある時点で、SCryptとBCryptの両方が、平均的なユーザーのコンピューター(またはWebアプリのサーバー側で実行している場合はサーバー)で1つのハッシュを正当に計算するのにかかる時間によって制限されます。 SCryptが4000倍遅いと、ウェブサイトの直帰率がセキュリティの向上よりも高くなる可能性があります。
BCryptを選択する理由:
BCryptは14歳であり、20年以上の暗号に基づいており、どちらも実行可能な理論上の弱点があることが示されていません(BCryptに影響を与えないBlowfishには既知のプレーンテキストの脆弱性がありますが、 BCryptの1つのUNIX実装のバグは、特定の文字コードが供給された場合にアプリケーション障害を引き起こす可能性があります。
SCryptは3〜4年しか経過していないため、ほとんどの暗号技術者の信頼を獲得するために必要な暗号解読の血統がありません。これは、脆弱であることを意味するものではありません。これは、mopstのセキュリティ専門家が脆弱ではないほど十分に自信がないことを意味しますまだ。
BCryptよりもSCryptを選択する理由は1つだけあり、それがSCryptが設計された理由です。分散型解読システムに対するBCryptの主な弱点は、低く、一定のメモリ使用量です。これにより、BCryptは、比較的安価なフィールドプログラマブルゲートアレイまたはFPGAを使用した費用対効果の高い総当たり攻撃に対して脆弱になります。これらのアレイには、ロジックブロックに組み込まれている比較的少量のSRAMがあり、BCryptの状態データを保持するのに十分です。 Thomasが言ったように、これらのアレイは、従来のCPUまたはGPUベースのクラックボットの分散ネットワークよりも購入および設定が安価なので、攻撃者は彼のお金でより多くを得ることができます。
対照的に、SCryptは指数時間だけでなく指数メモリも使用します。派生のラウンド数が増加するにつれて、SCryptは一連の中間状態データ「スナップショット」の格納を必要とします。これは、以降の派生操作で使用されます。正当なユーザーのコンピューターが1つのハッシュを生成することで問題はありません(おそらく最大で数MBを使用しています)が、FPGAブロックの限られたメモリはすぐに不十分になります。これで、格納できるものは何でも、代わりに「オンデマンド」で計算できますが、これらの中間状態のそれぞれは、独自の指数関数的に複雑な一連の操作の結果です(各操作は、最終的なハッシュよりも複雑ではありませんが、オンデマンドで使用するにはさらに計算する必要があります)、攻撃者はジレンマの角にいます。オンデマンドモデルの計算時間の増加に対応するために、指数関数的に多くのFPGAが必要か、または仕事を行うのに十分なメモリを備えたFPGAにアップグレードする必要がある(基本的に、単純な高クロックCPU/FSBを検討している)この時点での/ RAMアーキテクチャは、数百万ドルのペタフロップの分散クラスターの背後にあるものです)。どちらにしても、FPGAはBCrypt(またはPBKDF2)の場合ほど実現可能ではありません。
scryptを使用すると、計算量が増えるだけでなく、ハッシュの計算に必要なメモリ量を増やすことができます。これはソフトウェアの実装をそれほど気にしませんが、ハードウェアで実装するのははるかに困難です-これは、専用の攻撃者が開発して使用する可能性が高いものです。 bcrypt(およびPBKDF2)は、一定量の少量のメモリを使用します
- Orip
あたり https://stackoverflow.com/questions/1226513/whats-the-advantage-of-scrypt-over-bcrypt