.NET自定义MembershipProvider解密密码

时间:2010-02-08 16:55:21

标签: c# .net asp.net-membership membership-provider

我在ac#项目中使用自定义的MemberShipProvider,基于以下代码:http://www.asp.net/learn/videos/video-189.aspx由于某些原因我无法弄清楚,解密用户密码以验证登录的方法提供了额外的密码值前面有8个字符(例如:䝉惯尝㳪畕锬密码)。

我使用“加密”密码格式和UnEncodePassword方法包含在:

private string UnEncodePassword(string encodedPassword)
{
    string password = encodedPassword;
    password = Encoding.Unicode.GetString(DecryptPassword(Convert.FromBase64String(encodedPassword)));

    return password;
}

谢谢!

3 个答案:

答案 0 :(得分:6)

“䝉惯尝㳪畕锬”是salt? (更新)

在服务器上,在web.config或其他内容中,您有一个salt值,例如“milkshake”。当用户提供类似“TheYard”的密码时,您需要添加盐并加密“milkshakeTheYard”。当他们登录时,您将盐添加到他们的请求中并将其与加密的字符串进行比较。

那么盐有什么意义呢?如果加密密码落入坏人之手,“TheYard”只有7个字符,很容易在Rainbow Table上查找。通过添加盐,可以使这个过程更加困难。

盐本身提供的安全性很小,但结合使用可以提供一个容易实现的额外层。

答案 1 :(得分:4)

您应该无法解密密码。您应该加密用户输入的密码并将其与存储的加密密码进行比较。密码恢复应生成随机的一次性密码,并强制用户在第一次使用时更改密码。

答案 2 :(得分:2)

发现它!我必须从解密的encodedPassword变量中减去16字节的盐来获取密码:

private string UnEncodePassword(string encodedPassword)
{
    string password = encodedPassword;
    byte[] bytesIn = Convert.FromBase64String(encodedPassword);
    byte[] bytesRet = DecryptPassword(bytesIn);
    password = System.Text.Encoding.Unicode.GetString(bytesRet, 16, bytesRet.Length - 16);

    return password;
}

谢谢伊恩给我关于盐的线索!