1

我在 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;
}

谢谢!

4

3 回答 3

6

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

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

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

Salt 本身提供的安全性很小,但结合使用提供了一个易于实现的额外层。

于 2010-02-08T17:02:33.857 回答
4

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

于 2010-02-09T12:53:06.503 回答
2

找到了!我必须从解密后的 encodePassword 变量中减去 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;
}

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

于 2010-02-09T12:43:30.373 回答