即使使用Hashed passwordFormat设置,ASP.Net Membership也会将更改的密码保存为纯文本

Ben*_*Ben 2 membership asp.net passwords format

我正在使用ASP.Net SqlMembershipProvider来管理我的用户.这是我的配置:

<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
            <providers>
                <clear />
                <add
                    name="SqlProvider"
                    type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                    connectionStringName="SiteDatabase"
                    applicationName="WPR"
                    minRequiredPasswordLength="6"
                    minRequiredNonalphanumericCharacters="0"
                    enablePasswordRetrieval="false"
                    enablePasswordReset="true"
                    requiresQuestionAndAnswer="false"
                    requiresUniqueEmail="true"
                    passwordFormat="Hashed" />
            </providers>
        </membership>
Run Code Online (Sandbox Code Playgroud)

我的问题是:当我调用Membership.CreateUser来创建新用户时,密码以散列格式存储在数据库中,并带有一个盐 - 这一切都很好.但是,当我在管理功能中调用Membership.ChangePassword时,它以纯文本格式存储密码.我真的无法理解这种行为,因为配置清楚地说"Hashed"并且创建新用户会创建一个哈希密码.

Rus*_*Cam 6

ChangePassword()默认ASPMembership提供程序的方法中,从数据库中检索现有用户的密码格式,该格式是用于编码现有用户的新密码的格式,而不是设置的密码格式,web.config现在可以指定一种不同的格式.您可以通过下载默认提供程序的源代码来自行查看.

我的问题是,密码是否以明文形式存储给已经以明文形式存储密码的用户?您可以通过检查表中用户的PasswordFormat字段的值来轻松检查此问题aspnet_Membership.价值观是:

Clear = 0,
Hashed = 1,
Encrypted = 2,
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您需要自己散列清除密码,框架代码可能会派上用场

// generate a salt
public string GenerateSalt()
{
    byte[] buf = new byte[16];
    (new RNGCryptoServiceProvider()).GetBytes(buf);
    return Convert.ToBase64String(buf);
}

// hashes the password, using the supplied salt
public string HashPassword(string pass, string salt)
{
    byte[] bIn = Encoding.Unicode.GetBytes(pass);
    byte[] bSalt = Convert.FromBase64String(salt);
    byte[] bAll = new byte[bSalt.Length + bIn.Length];
    byte[] bRet = null;

    Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
    Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);

    // this assumes a Hashed password (PasswordFormat = 1)
    HashAlgorithm s = HashAlgorithm.Create( Membership.HashAlgorithmType );
    bRet = s.ComputeHash(bAll);

    return Convert.ToBase64String(bRet);
}
Run Code Online (Sandbox Code Playgroud)

现在您只需要从PasswordFormat = 0的数据库中提取所有记录,通过控制台应用程序运行它们以散列密码并将salt,哈希密码保存到数据库,以及将PasswordFormat字段更新为1