因此,一旦用户登录,我将运行以下设置:
创建新用户时,密码将获取一个生成的哈希值,并与新生成的Salt串联。 HashedPassword + Salt存储在与Salt列分开的列中。然后,我调用方法VerifyHashedPassword(string storedHashedPass, String password)
storedHashedPass
是存储的哈希密码(带有盐),password
是用户在登录时输入的明文密码,其中包含从存储中检索到的盐的串联。
但是当我尝试实现此功能时,它会抛出'System.FormatException'
有人可以帮我弄清楚我在做什么错吗?
public static bool VerifyHashedPassword(string hashPassword, String password)
{
return System.Web.Helpers.Crypto.VerifyHashedPassword(hashPassword, password);
}
public static string GetSalt()
{
var random = new RNGCryptoServiceProvider();
int max_length = 32;
byte[] salt = new byte[max_length];
random.GetNonZeroBytes(salt);
return Convert.ToBase64String(salt);
}
public static string hashPassword(string password)
{
return System.Web.Helpers.Crypto.HashPassword(password ?? "");
}
答案 0 :(得分:1)
HashedPassword + Salt存储在列中
这可能是根本问题。您不需要提供或处理盐。参见this answer。
您不需要GetSalt()
方法。
您不能简单地连接2个base64字符串,解码器不知道如何处理。
答案 1 :(得分:0)
Base64格式每个字符存储6位。由于字节为8位,因此有时最后需要填充。附加一个或两个postback
字符。否则不使用=
。
如果在连接处连接两个Base64字符串,则可能会有一些填充。将填充放在Base64字符串的中间无效。
而是连接字节数组,然后进行编码。