如何手动创建asp.net成员资格提供程序哈希密码?

Anh*_*dir 13 asp.net hash asp.net-membership salt password-protection

我使用网站作为前端,所有用户都使用标准的ASP.NET Membership-Provider进行身份验证.密码在SQL数据库中保存为"哈希".

现在我想编写一个具有管理功能的桌面客户端.除其他事项外,应该有一种重置用户密码的方法.我可以使用保存的成员资格数据访问数据库,但是如何手动创建password-salt和-hash?使用System.Web.Membership命名空间似乎不合适,所以我需要知道如何手动创建新密码的salt和hash.

专家加紧!:)

Anh*_*dir 15

我使用反射器来看看.NET-Framework使用内部的那些方法.也许有公共方法可用于此但我没有找到它们 - 如果你知道如何查询这些内部方法作为用户请发表评论!:)

这是没有不必要条件的简化源代码,因为我只想将密码编码为SHA1-Hash:

private string GenerateSalt() {
  var buf = new byte[16];
  (new RNGCryptoServiceProvider()).GetBytes(buf);
  return Convert.ToBase64String(buf);
}

private string EncodePassword(string pass, string salt) {
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    byte[] inArray = null;
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}
Run Code Online (Sandbox Code Playgroud)

  • 无需使用Reflector,可以随时使用默认提供程序的源代码 - http://download.microsoft.com/download/a/b/3/ab3c284b-dc9a-473d-b7e3-33bacfcc8e98/ProviderToolkitSamples.msi.看一下SqlMembershipProvider的EncodePassword方法来实现.它使用默认的哈希算法,除非为MembershipProvider指定了一个.IIRC,默认为SHA-1 (8认同)

For*_*lon 13

您绝对可以System.Web.Security在控制台或winforms应用程序中使用.

这是一个简单的控制台应用程序:

static void Main(string[] args)
{
    MembershipProvider provider = Membership.Provider;

    MembershipUser myUser = provider.GetUser("myUser", false);

    if( myUser != null ) provider.DeleteUser("myUser", true);

    MembershipCreateStatus status;

    myUser = provider.CreateUser("myUser", "password", "user@example.com", null, null, true, null, out status);

    if (status != MembershipCreateStatus.Success)
    {
        Console.WriteLine("Could not create user.  Reason: " + status.ToString());
        Console.ReadLine();
        return;
    }

    Console.WriteLine("Authenticating with \"password\": " + provider.ValidateUser("myUser", "password").ToString());

    string newPassword = myUser.ResetPassword();

    Console.WriteLine("Authenticating with \"password\": " + provider.ValidateUser("myUser", "password").ToString());
    Console.WriteLine("Authenticating with new password: " + provider.ValidateUser("myUser", newPassword).ToString());

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

和app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.web>
        <membership defaultProvider="MyMembershipProvider">
            <providers>
                <clear />
                <add name="MyMembershipProvider"
                     type="System.Web.Security.SqlMembershipProvider"
                     connectionStringName="MyConnectionString"
                     applicationName="MyApplication"
                     minRequiredPasswordLength="5"
                     minRequiredNonalphanumericCharacters="0"
                     requiresQuestionAndAnswer="false" />
            </providers>
        </membership>
    </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)