如何手动创建asp.net成员资格提供程序哈希密码?
我使用一个网站作为前端,所有用户都通过标准ASP.NET成员资格提供商的身份验证。密码以“哈希”方式保存在SQL数据库中 现在我想编写一个具有管理功能的桌面客户端。除此之外,还应该有一种重置用户密码的方法。我可以使用保存的成员数据访问数据库,但是如何手动创建密码salt-and-hash?使用System.Web.Membership名称空间似乎不合适,因此我需要知道如何手动创建新密码的salt和hash 专家们站起来!:) 快速脏法如何手动创建asp.net成员资格提供程序哈希密码?,asp.net,asp.net-membership,hash,password-protection,salt,Asp.net,Asp.net Membership,Hash,Password Protection,Salt,我使用一个网站作为前端,所有用户都通过标准ASP.NET成员资格提供商的身份验证。密码以“哈希”方式保存在SQL数据库中 现在我想编写一个具有管理功能的桌面客户端。除此之外,还应该有一种重置用户密码的方法。我可以使用保存的成员数据访问数据库,但是如何手动创建密码salt-and-hash?使用System.Web.Membership名称空间似乎不合适,因此我需要知道如何手动创建新密码的salt和hash 专家们站起来!:) 快速脏法 Public Shared Function GetSalt
Public Shared Function GetSaltKey() As String
Dim saltBytes() As Byte
Dim minSaltSize As Integer = 4
Dim maxSaltSize As Integer = 8
' Generate a random number for the size of the salt.
Dim random As Random
random = New Random()
Dim saltSize As Integer
saltSize = random.Next(minSaltSize, maxSaltSize)
' Allocate a byte array, which will hold the salt.
saltBytes = New Byte(saltSize - 1) {}
' Initialize a random number generator.
Dim rng As RNGCryptoServiceProvider
rng = New RNGCryptoServiceProvider()
' Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes)
' Convert plain text into a byte array.
Return Convert.ToBase64String(saltBytes)
End Function
Public Shared Function ComputeHash(ByVal password As String, ByVal salt As String) As String
Return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(salt & password, _
System.Web.Configuration.FormsAuthPasswordFormat.SHA1.ToString)
End Function
虽然,成员名称空间也为此内置了一些东西,如被遗忘的分号所述,我已经有一段时间没有修改ASP.Net成员资格了,但请记住,处理一些与之相关的东西(由于现有的用户数据库,需要自定义一些东西)。在这项工作中,我覆盖了这些方法(现有的用户db有md5哈希PWD) 因此,在同一“思路”中: 通过桌面应用程序可以引用的web服务公开成员资格API。这样,你不是在“创造”东西,而是在使用它们。您不必重写任何内容,您只需通过桌面应用程序的web服务公开现有方法 不用说,您必须保护此端点 如果以上内容对您的口味来说过于粗略,那么这里有一个指向asp.net论坛的链接,其中涉及一些试图重新创建哈希的尝试……我无法确认其准确性,但应该很容易测试出来:
我使用reflector查看了.NET Framework内部使用的那些方法。可能有一些公共方法可用于此,但我没有找到它们-如果您知道如何作为用户查询这些内部方法,请留下评论!) 以下是简化的源代码,没有不必要的条件,因为我只想将密码编码为SHA1哈希:
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);
}
您完全可以在控制台或winforms应用程序中使用
System.Web.Security
下面是一个简单的控制台应用程序:
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();
}
以及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>
System.Web.Security为什么不合适?似乎是适合这项工作的工具。我不能使用我的sql数据库在桌面客户端应用程序中包含成员资格提供程序,可以吗?如果可能的话,你是对的,我可以用这些方法。。。但是如何实现呢?谢谢你的web服务想法。你说得对,在正常情况下,我会通过一项服务提供所有会员服务。不幸的是,公司政策不允许这种web服务:(很好的方法,但与标准asp.net成员资格提供程序使用的方法不同-使用此方法设置新密码后,用户无法再登录。无论如何,谢谢:)我正在生产网站(旧网站)上与asp.net成员资格提供程序一起使用此代码,重新计算哈希和salt密钥,并对每个身份验证进行比较,这是安全性的来源。不要吹毛求疵,但您的问题只是询问如何计算salt,并且手动获取密钥。无需使用Reflector,默认提供程序的源代码随时可用-。请看一下SqlMembershipProvider的EncodePassword方法的实现。除非为MembershipProvider指定了哈希算法,否则它使用默认哈希算法。IIRC,默认值为SHA-1