18

可能重复:
WebMatrix WebSecurity PasswordSalt

有没有办法让 simpleMembershipProvider 使用盐?

当我创建我的 mvc4 web 项目并将默认连接设置为 sqlexpress,然后注册时,我的用户没有密码 salt

在此处输入图像描述

我希望它尽可能安全而不会带来太多麻烦。

4

2 回答 2

25

PasswordSalt 列未使用,但在创建存储在 Password 字段中的散列密码时使用加盐。如果您查看 SimpleMembershipProvider 的源代码,您可以看到这一点:http: //aspnetwebstack.codeplex.com/SourceControl/changeset/view/3a669e7112e7#src%2fWebMatrix.WebData%2fSimpleMembershipProvider.cs

检查 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 成员资格提供程序中可能的全部功能,正如所有 ASP.NET 成员资格提供程序使用的 MembershipProvider 类中所定义的那样。类中的某些成员是可用的,因为它们是从基类继承的,但如果您访问它们会抛出异常。

如果您的网站需要完整的成员资格提供程序功能,您可以跳过网页成员资格系统的初始化(即不要调用 WebSecurity.InitializeDatabaseConnection()),而是确保启用标准成员资格和角色提供程序。在这种情况下,您对 SimpleMembershipProvider 类的调用将传递给标准提供者(在 SimpleMembershipProvider 类文档中称为先前的提供者)。有关详细信息,请参阅配置 ASP.NET 应用程序以使用成员资格。

PasswordSalt字段是这些列之一。如果您查看 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 回答