2011-08-17 9 views
8

C#コードを理解しようとしていますが、私は手渡されました。暗号化を扱っていて、特にSystem.Security.CryptographyPasswordDeriveBytesを使用しています。.NET:PasswordDeriveBytesとRfc2898DeriveBytesの相違点

.NET docsではPasswordDeriveBytesはPBKDF2である「PKCS#5 v2.0標準」として指定された文書の後ろに「PBKDF1アルゴリズムの拡張子」を使用しています)。しかし、私が見つけたネット上のどこにでも(Stack Exchangeを含む)、誰もが「Rfc2898DeriveBytesを使用して、パスワード*が廃止され、PBKDF1を使用する」と言います。しかし、msdn.microsoft.comのドキュメントの唯一の違いは、Rfc * -versionに特にPBKDF2が言及されているようです.PBKDF2では、Password *に「PBKDF1の拡張」と「PKCS#5 v 2.0」と記載されています。

2つのクラス(もしあれば)の違いとPBKDF2パスワードキーの導出には他のものよりもむしろどちらを使うべきか教えてください。

ここで、同じデータを扱う他のコードでは明示的にPBKDF2が使用され、動作するため、PasswordDeriveBytesでもPBKDF2も使用されているとか、PBKDF2はPBKDF1と単純に互換性がありますそれは何かの副作用ではないことを確かに知っている、そして物事は本当になぜ理解していない人はまったく魔法のように動作します(そして最終的にはおそらく魔法と壮観に壊れます)。

答えて

0

PKCS#5 v2.0後方互換性との理由のためPBKDF1とPBKDF2、かつての両方を定義してもあなたが新しいアプリケーションのためのPBKDF2を使用することをお勧めします。なぜ後者が前者より優れているのか分かりませんが、2つの.NETクラスは異なるが相互運用可能なアルゴリズムを使用しているようです。 (。おそらく唯一の結果のキーは入力が+ KDFではなく、交換されているので)

+0

疑問に思ったように、物事は主に偶然に作用するもので、デザインによってはそれほどではありません... – adamski

+0

出力データと "その他のコード"によって使用される暗号化方式/ KDF暗号化スキームがPBKDF2を使用すると判断された後に使用されるコードパスがあります。本当に「明示的にPBKDF2を使用する」からは分かりません。 – millimoose

1

ここでの違いを詳細にブログ記事です:

http://blogs.msdn.com/b/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx

PBKDF2は、任意の長さの鍵を生成するために使用することができ、これはパスワードベースの暗号化(対称暗号の必要に応じて任意の鍵長を生成することができます)では非常に便利ですが、安全なパスワード保存にはあまり意味がありません。また、弱塩の場合により良いセキュリティ特性を有するPBKDF1のような連結の代わりにHMACを用いて塩を適用する。

+0

はい、私は1と2の違いについては求めていませんでしたが、2つの特定の.NETクラスの違いについては質問していませんでした。 :) – adamski

+0

一方は1を実装し、もう一方は2を実装します。 – orip

+1

"拡張機能"とは何ですか? – adamski

1

私はこれまで偉大な答えはここで見つけることだと思う:

C# PasswordDeriveBytes Confusion

しかしsumupへ:元PKCS#5(別名PBKDF1)の

Microsoftの実装は、より多くを提供するために、安全でない拡張子を含めますバイト数は、ハッシュ関数が提供できる値より大きい(バグレポートのこことここを参照)。それはあなたが標準に文書化されていない、独自の拡張を避ける必要がありバギーされなかった場合でも

(またはあなたが将来的にあなたのデータを復号化することはできませんかもしれない - 。少なくともいないWindowsの外で)

私は強くあなたがすることをお勧め.NET 2.0以降で使用可能なPBKDF2(PKCS#5 v2)を実装する新しいRfc2898DeriveBytesを使用します。

1

PasswordDeriveBytesをインスタンス化し、GetBytesメソッドを1回呼び出すと、基礎となるダイジェストアルゴリズムの出力サイズよりも小さい値を渡すと、PBKDF1アルゴリズムから値が返されます。

同じオブジェクトに対してGetBytesを2回コールすると、実装でカウントのバグが発生する可能性があります。

PBKDF1は、ハッシュアルゴリズムのサイズ(たとえば、SHA-1の場合は20バイト)まで出力するようにのみ記述されていますが、PasswordDeriveBytesクラスは、ハッシュ出力サイズの最大1000倍をサポートする式を構成しています。したがって、このクラスによって生成される大きな値は、別のプラットフォームでは容易に達成できない可能性があります。


あなたがRfc2898DeriveBytesをインスタンス化する場合は、PBKDF2アルゴリズムのストリーミングの実装を取得します。 PBKDF2とPBKDF1の最も明白な違いは、PBKDF2が任意の量のデータを生成できることです(制限は(2^32-1)*hashOutputSize、SHA-1は85,899,345,900バイト)。また、PBKDF2は、より複雑な構成(特に、直接ダイジェストよりもHMAC)を使用して、入力パスワードを出力値から回復することをより困難にします。

実装の「ストリーミング」は、GetBytes(5)GetBytes(3)の連結がGetBytes(8)と同じであることです。 PasswordDeriveBytesとは異なり、これはRfc2898DeriveBytesで正しく動作します。


PBKDF1は、もともと1999年に(RFC2898として再発行された)PKCS#5 V2.0に公開された1993年 PBKDF2にPKCS #5 v1.5に公開、DES鍵を生成することが見出されなければならないスライドデッキを作成しました。 ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdfにある(しかし、問題があると思われるので、ftp://ftp.dfn-cert.de/pub/pca/docs/PKCS/ftp.rsa.com/99workshop/pkcs5_v2.0.pptがそうするかもしれない)、さらに違いを要約する。 (スライドデッキはPBKDF1とPBKDF2の作成者であるRSA Securityによって書かれたもので、PBKDF1よりもPBKDF2を推奨する人です)。

関連する問題