在使用SimpleMembershipProvider时要使用盐。

18

可能是重复问题:
WebMatrix WebSecurity PasswordSalt

是否有办法让simpleMembershipProvider使用盐呢?

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

输入图像描述

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

2个回答

25
PasswordSalt列未使用,但在创建存储在Password字段中的哈希密码时使用了盐。如果查看SimpleMembershipProvider的源代码,可以看到这一点:http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/3a669e7112e7#src%2fWebMatrix.WebData%2fSimpleMembershipProvider.cs 检查CreateUserAndAccount方法。它使用Crypto.HashPassword方法: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);
    }

基本上,为了解决你的担忧,它足够安全,而无需你额外费心。


嗯,那么为什么有盐列呢?如果盐列有用,我们可以做哪些可能的情况? - jonprasetyo
@jonprasetyo,我不知道。我的最佳猜测是,它是从之前的提供程序模式转移而来的,并且在决定将盐与哈希集成并存储在一个位置时未被删除。 - Mike Brind

2

引用自文档

SimpleMembershipProvider类的设计并没有实现ASP.NET成员提供程序中可能存在的所有功能,如MembershipProvider类在所有ASP.NET成员提供程序中使用的定义。该类中的一些成员可用是因为它们从基类继承,但如果您访问它们,则会引发异常。

如果您的网站需要完整的成员提供程序功能,则可以跳过Web Pages成员资格系统的初始化(即不要调用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方法。


但是,密码列确实保存了一个哈希密码。微软使用哪种盐?MAC地址吗? - ilans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接