使用Membership时使用了Hashed的加密方式,在程序中如果使用MembershipUser.GetPassword()方法无法取得用户密码,提示"This Membership Provider has not been configured to support password retrieval.",查过MSDN说Hashed方式加密的密码无法进行解密获取。没办法,后来想通过它的重载方法MembershipUser.GetPassword(string answer),可查询数据库,密码恢复的问题答案也是加密过了的,我现在真是一点办法都没有了,请高手们帮忙,谢谢!
出于安全考虑,你是获取不到了……Hashed是不可逆的
查看SqlMembershipProvider的实现:
首先你要设置EnablePasswordRetrieval为true ,
其次如果采用的是明文存储密码的话,能获取到,如果加密了,无法获取(参考UnEncodePassword方法)。
细节自己反编译查看吧。
public override string GetPassword(string username, string passwordAnswer)
{
if (!this.EnablePasswordRetrieval)
{
throw new NotSupportedException(SR.GetString("Membership_PasswordRetrieval_not_supported"));
}
SecUtility.CheckParameter(ref username, true, true, true, 0x100, "username");
string encodedPasswordAnswer = this.GetEncodedPasswordAnswer(username, passwordAnswer);
SecUtility.CheckParameter(ref encodedPasswordAnswer, this.RequiresQuestionAndAnswer, this.RequiresQuestionAndAnswer, false, 0x80, "passwordAnswer");
int passwordFormat = 0;
int status = 0;
string pass = this.GetPasswordFromDB(username, encodedPasswordAnswer, this.RequiresQuestionAndAnswer, out passwordFormat, out status);
if (pass != null)
{
return base.UnEncodePassword(pass, passwordFormat);
}
string exceptionText = this.GetExceptionText(status);
if (this.IsStatusDueToBadPassword(status))
{
throw new MembershipPasswordException(exceptionText);
}
throw new ProviderException(exceptionText);
}
UnEncodePassword方法:
Code
为了安全起见,一般成形的系统是不会明文储存密码的,所以用户无法找回密码。
这些系统处理密码丢失问题时都是先确认用户是否是帐户所有者,当确认后,会自动随机生成一个新的密码,并再次对这个密码加密覆盖掉原密码,然后将这个新密码用邮件发送给用户。用户可以用这个密码登录系统并重新设置自己的密码。
这样可以基本保证就算数据库外泄,用户密码信息还是安全的。
如果楼主需要返回原密码的话,那么在加密的时候就应该使用可逆算法吧,但这样又不安全了。