使用SimpleMembershipProvider时使用salt

时间:2012-09-22 14:50:04

标签: asp.net asp.net-mvc-4 membership-provider simplemembership

  

可能重复:
  WebMatrix WebSecurity PasswordSalt

有没有办法让simpleMembershipProvider使用salt?

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

enter image description here

我希望它尽可能安全,没有太多麻烦。

2 个答案:

答案 0 :(得分:25)

PasswordSalt列未使用,但在创建存储在“密码”字段中的散列密码时使用了salting。如果您查看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);
    }

基本上,为了解决您的问题,它可以在不必为您带来任何额外麻烦的情况下保证安全。

答案 1 :(得分:2)

来自documentation

的引用
  

按照设计,SimpleMembershipProvider类不实现   ASP.NET成员资格中可以使用的全部功能   提供者,由MembershipProvider类中定义的   所有ASP.NET成员资格提供者有些成员可以参加   class因为它们是从基类继承的,但会抛出   如果你访问它们就是一个例外。

     

如果您的网站需要完整的会员提供商功能,   你可以跳过网页会员系统的初始化(那个   是,不要调用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方法。