18

重複の可能性:
WebMatrix WebSecurity PasswordSalt

simpleMembershipProvider にソルトを使用させる方法はありますか?

mvc4 Web プロジェクトを作成し、デフォルトの接続を sqlexpress に設定してから登録すると、ユーザーにパスワード ソルトがありません

ここに画像の説明を入力

あまり問題なくできる限り安全であることを望みます。

4

2 に答える 2

25

PasswordSalt 列は使用されませんが、[パスワード] フィールドに格納されるハッシュ化されたパスワードを作成するときにソルティングが使用されます。これは、 SimpleMembershipProviderのソース コードを見ればわかります。

CreateUserAndAccount メソッドを確認してください。Crypto.HashPasswordメソッドを使用します。

    /* =======================
     * HASHED PASSWORD FORMATS
     * =======================
     * 
     * Version 0:
     * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations.
     * (See also: SDL crypto guidelines v5.1, Part III)
     * Format: { 0x00, salt, subkey }
     */

    public static string HashPassword(string password)
    {
        if (password == null)
        {
            throw new ArgumentNullException("password");
        }

        // Produce a version 0 (see comment above) password hash.
        byte[] salt;
        byte[] subkey;
        using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount))
        {
            salt = deriveBytes.Salt;
            subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
        }

        byte[] outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength];
        Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize);
        Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength);
        return Convert.ToBase64String(outputBytes);
    }

基本的にあなたの懸念に対処するために、それは必要なだけ安全であり、追加の問題を起こす必要はありません.

于 2012-09-22T15:37:57.163 に答える
2

ドキュメントからの引用:

設計上、SimpleMembershipProvider クラスは、すべての ASP.NET メンバーシップ プロバイダーで使用される MembershipProvider クラスで定義されているように、ASP.NET メンバーシップ プロバイダーで可能なすべての機能を実装していません。一部のメンバーは、基本クラスから継承されているため、クラスで使用できますが、それらにアクセスすると例外がスローされます。

Web サイトで完全なメンバーシップ プロバイダー機能が必要な場合は、Web ページ メンバーシップ システムの初期化をスキップできます (つまり、WebSecurity.InitializeDatabaseConnection() を呼び出さないでください)。代わりに、標準のメンバーシップ プロバイダーとロール プロバイダーが有効になっていることを確認してください。その場合、SimpleMembershipProvider クラスに対して行う呼び出しは、標準プロバイダー (SimpleMembershipProvider クラスのドキュメントでは以前のプロバイダーと呼ばれます) に渡されます。詳細については、「メンバーシップを使用するように ASP.NET アプリケーションを構成する」を参照してください。

PasswordSaltフィールドはそれらの列の 1 つです。SimpleMembershipProvider のソース コードを見ると、PasswordSalt 列が単純に次のように設定されていることがわかりますstring.Empty

if (database.Execute("INSERT INTO [" + MembershipTableName + "] (UserId, [Password], PasswordSalt, IsConfirmed, ConfirmationToken, CreateDate, PasswordChangedDate, PasswordFailuresSinceLastSuccess) VALUES (@0, @1, @2, @3, @4, @5, @5, @6)", new object[] { num, str, string.Empty, !requireConfirmationToken, obj3, DateTime.UtcNow, num2 }) != 1)
{
    throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
}

したがって、それを使用したい場合は、デフォルトのものをオーバーライドして PasswordSalt を自分で生成するカスタム メンバーシップ プロバイダーを作成できます。メソッドをオーバーライドできますCreateAccount

于 2012-09-22T15:38:33.133 に答える