43

これを行う方法についてmsdnやその他のリソースを調べましたが、明確な解決策が見つかりませんでした。これは私が見つけた最高のものですhttp://blogs.msdn.com/b/shawnfa/archive/2004/04/14/generated-a-key-from-a-password.aspx?Redirected=true

bcryptまたはPBKDF2(bcryptに関連しているようです)を使用してC#でパスワードをハッシュしたいと思います。コンピューターがパスワードをハッシュするのに何ラウンドかかるかを実験するのが好きです。しかし、誰もがハッシュについて話している間、すべてが暗号化に関するもののようです。私はそれを理解することはできません。パスワードをハッシュするにはどうすればよいですか?PBKDF2(Rfc2898?)は乱数ジェネレーターのように見え、GetBytes(amount)を使用してハッシュサイズの大きさを選択します。

よくわかりません。bcrypt / PBKDFを使用してパスワードをどの程度正確にハッシュしますか?

4

9 に答える 9

37

PBKDF2

あなたは実際に本当に近くにいました。あなたが提供したリンクは、 Rfc2898DeriveBytes関数を呼び出して PBKDF2 ハッシュ結果を取得する方法を示しています。ただし、例が暗号化の目的で派生キーを使用していたという事実にうんざりしていました (PBKDF1 と 2 の元々の動機は、暗号化キーとして使用するのに適した「キー」派生関数を作成することでした)。もちろん、出力を暗号化に使用するのではなく、独自のハッシュとして使用します。

PBKDF2が必要な場合は、まさにこの目的のために作成されたSimpleCrypto.Netライブラリを試すことができます。implementationを見ると、実際には (ご想像のとおり) Rfc2898DeriveBytesの薄いラッパーであることがわかります。

Bクリプト

このバリアントを試してみたい場合は、BCrypt.NETという名前の C# 実装を試すことができます。

免責事項:リンクしたライブラリを使用またはテストしていません... YMMV

于 2012-07-10T12:28:06.557 に答える
13

まず第一に、プラットフォーム自体に含まれている暗号的に検証された参照アルゴリズムを使用することをすべての人に強く勧めます.

サード パーティのパッケージや検証されていない OSS コンポーネント、またはインターネットからコピーして貼り付けただけのその他のコードは使用しないでください。

.NETの場合は、bCryptではなく PBKDF2を使用します。これは、.NET 用の bCrypt の認定された実装がないためです。

高貴なオープンソース開発者 (私もそうです) を軽視しているわけではありませんが、彼らの Web サイトが 10 年以内にハッキングされず、Nuget/npm などからマルウェア パッケージを取得することになるとは確信できません。パッケージマネージャー。

検証の詳細については、この SO 回答を参照してください。

さて、PBKDF2 に戻ります。簡単なコードは次のとおりです。

public static byte[] PBKDF2Hash(string input, byte[] salt)
{
    // Generate the hash
    Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(input, salt, iterations: 5000);
    return pbkdf2.GetBytes(20); //20 bytes length is 160 bits
}

ハッシュの文字列表現(バイト配列ではない)が必要な場合は、この回答http://stackoverflow.com/a/624379/714733からこの超高速変換クラスを使用できます

于 2019-07-09T09:37:45.643 に答える
11

ハッシュ化されたパスワードを機能させるために実際にコーディングするものを見つけるのに、私は永遠に(何日もかかりました)かかりました!! ので、便宜上ここに置きます。

ドキュメント理論 1 理論 2を読む必要があります。セキュリティは非常に大きなトピックです。バイヤーは注意してください!

NuGet パッケージ BCrypt.Net をソリューションに追加する

const int WorkFactor = 14;
var HashedPassword = BCrypt.Net.BCrypt.HashPassword(Password, WorkFactor); 

WorkFactorを適切なものに調整する必要があります。ディスカッションを参照してください。そのlog2関数

「数値は log2 なので、コンピューターの速度が 2 倍になるたびに、既定の数値に 1 を加えます。」

次に、ハッシュ化されたパスワードをデータベースに保存し、次のようpasswordFromLocalDBに着信をテストします。password

if (BCrypt.Net.BCrypt.Verify(password, passwordFromLocalDB) == true)

幸運を!

于 2016-09-20T14:03:02.883 に答える
3

今年の初め、私は ASP.NET Web フォーム プロジェクトのハッシュを作成するために同じことを検討していました。MVC プロジェクトがすぐに行うのと同じ方法でそれを行いたいと考えていました。

この質問に出くわしました => ASP.NET ID のデフォルトのパスワード ハッシャー、どのように機能し、安全ですか? 次に、ここで ByteArraysEqual メソッドを含むソースを見つけました => http://www.symbolsource.org/MyGet/Metadata/aspnetwebstacknightly/Project/Microsoft.AspNet.Identity.Core/2.0.0-rtm-140327/Release/Default/ Microsoft.AspNet.Identity.Core/Microsoft.AspNet.Identity.Core/Crypto.cs?ImageName=Microsoft.AspNet.Identity.Core

于 2014-12-05T15:05:26.407 に答える
1

PBKDF2 は HMACSHA1 を使用します。よりモダンでカスタマイズ可能なソリューションが必要な場合は、PBKDF2 と同様にキー ストレッチングを使用して HMACSHA256 または 512 を使用するこの API を検討する必要があります。

https://sourceforge.net/projects/pwdtknet/

ソース コードに含まれるサンプル GUI は、暗号ランダム ソルトの作成を含む、パスワードからハッシュを取得する方法を示しています。お楽しみください :)

于 2012-10-04T03:45:12.230 に答える
1

PBKDF2 の場合、System.Security.Cryptography.Rfc2898DeriveBytes を使用できる場合があります。

ここで MSDN を参照してください: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

于 2012-07-10T12:23:23.573 に答える