强力重置asp.net membership加密后的密码![转]
公司网站的用户管理采用的是ASP.NET内置的membership管理,在web.config文件中的密码格式配置是加密了的,passWordFormat="Hashed",这样在用户注册的时候存到数据库中的密码都是加密了的,如果你忘记密码了要找回密码的时候必须要记得注册时写的密码问题答案,可是如果密码问题答案也忘记的话。。。因为密码是加了密的,所以也不知道他的密码的生成规律,直接改数据库也不懂怎么改。。。这个问题在以前的时候碰到过,当时特意上网搜索了一下,竟然没有发现,不知道是不是我的关键字输入错误还是怎么的,今天上台湾的论坛逛成人版块的时候发现论坛中的编辑版块有篇文章是教你怎么样在不记得密码,利用了membership其中的一个存储过程,废话少说,亮code:
C#代码
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Web;
- usingSystem.Web.UI;
- usingSystem.Web.UI.WebControls;
- usingSystem.Web.Configuration;
- usingSystem.Data.SqlClient;
- usingSystem.Web.Security;
- usingSystem.Data;
- publicpartialclassResetPassword:System.Web.UI.Page
- {
- PRotectedvoidPage_Load(objectsender,EventArgse)
- {
- }
- //重置
- protectedvoidbtnReset_Click(objectsender,EventArgse)
- {
- stringconnStr=WebConfigurationManager.ConnectionStrings["conn"].ToString();
- stringusername=txtUserName.Text.Trim();
- if(username.Length==0)
- {
- Response.Write("请输入用户名!");
- return;
- }
- //===产生加密用的密码密钥===
- stringsalt=GenerateSalt();
- //===将明码密码加密(此时密码为"P@ssw0rd"当然也可随机数生成)===
- stringpassword=EncryptToHashString("123456",salt,"SHA1");
- SqlConnectionconn=newSqlConnection(connStr);
- conn.Open();
- //===在此我们呼叫Membership提供者数据库里的预存程序来重置密码===
- SqlCommandcmd=newSqlCommand("aspnet_Membership_SetPassword",conn);
- cmd.CommandType=CommandType.StoredProcedure;
- //===目前使用Membership提供者的web应用程序名称===
- cmd.Parameters.Add(newSqlParameter("@applicationName",Membership.ApplicationName));
- //===要重置密码的用户账号===
- cmd.Parameters.Add(newSqlParameter("@UserName",username));
- //===加密过的密码===
- cmd.Parameters.Add(newSqlParameter("@NewPassword",password));
- //===密码加密密钥(一定和使用加密密码的密钥一样,不要再重新产生)===
- cmd.Parameters.Add(newSqlParameter("@PasswordSalt",salt));
- //===重置密码的时间===
- cmd.Parameters.Add(newSqlParameter("@CurrentTimeUtc",DateTime.Now));
- //===密码加密的格式(此时是Hash1,注意传入参数是int型态。)===
- cmd.Parameters.Add(newSqlParameter("@PasswordFormat",Membership.Provider.PasswordFormat.GetHashCode()));
- //===宣告一个可以接收回传值得参数===
- SqlParameterreturnValue=newSqlParameter();
- returnValue.ParameterName="returnValue";
- returnValue.Direction=ParameterDirection.ReturnValue;
- cmd.Parameters.Add(returnValue);
- //===执行预存程序===
- cmd.ExecuteNonQuery();
- conn.Close();
- //===检查重置密码是否成功===
- if(returnValue.Value.ToString()=="0")
- Response.Write("重置密码成功!!");
- else
- Response.Write("重置密码失败!!");
- }
- ///<summary>
- ///密码加密钥
- ///</summary>
- ///<returns></returns>
- publicstringGenerateSalt()
- {
- byte[]data=newbyte[0x10];
- newSystem.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(data);
- returnConvert.ToBase64String(data);
- }
- ///<summary>
- ///哈希密码加密(不可还原)
- ///</summary>
- ///<paramname="s">原始字符串</param>
- ///<paramname="saltKey">Salt加密字符串</param>
- ///<paramname="hashName">加密格式(md5,SHA1,SHA256,SHA384,SHA512.)</param>
- ///<returns>加密过的密码</returns>
- publicstringEncryptToHashString(strings,stringsaltKey,stringhashName)
- {
- byte[]src=System.Text.Encoding.Unicode.GetBytes(s);
- byte[]saltbuf=Convert.FromBase64String(saltKey);
- byte[]dst=newbyte[saltbuf.Length+src.Length];
- byte[]inArray=null;
- System.Buffer.BlockCopy(saltbuf,0,dst,0,saltbuf.Length);
- System.Buffer.BlockCopy(src,0,dst,saltbuf.Length,src.Length);
- System.Security.Cryptography.HashAlgorithmalgorithm=System.Security.Cryptography.HashAlgorithm.Create(hashName);
- inArray=algorithm.ComputeHash(dst);
- returnConvert.ToBase64String(inArray);
- }
- }
这样就把密码重置为123456了刚刚在做membership的测试的时修实然想到,数据表aspnet_Membership中的Password字段是存储密码的,FormatPassword字段是表示密码的存储格式的,0是明码,1是加密过的,假如我在数据库中把已经加密了的密码的FormatPassword改为0,然后Password改成123456, 测试,哈哈,竟然也能登陆了!!!