C# 生成的密码散列后面总是跟一个'==';
在我的应用程序中,我有一个对密码进行哈希运算并生成盐的类。出于某种原因,每个哈希似乎总是以双等号(=)结尾 我做错什么了吗?这些散列不安全吗 应用程序在c#和asp.net中,生成salt和hash的代码如下所示C# 生成的密码散列后面总是跟一个'==';,c#,asp.net,hash,passwords,C#,Asp.net,Hash,Passwords,在我的应用程序中,我有一个对密码进行哈希运算并生成盐的类。出于某种原因,每个哈希似乎总是以双等号(=)结尾 我做错什么了吗?这些散列不安全吗 应用程序在c#和asp.net中,生成salt和hash的代码如下所示 public class PasswordService : IPasswordService { private static RandomNumberGenerator random = RandomNumberGenerator.Create(); public
public class PasswordService : IPasswordService
{
private static RandomNumberGenerator random = RandomNumberGenerator.Create();
public string HashPassword(string salt, string password)
{
Rfc2898DeriveBytes hasher = new Rfc2898DeriveBytes(password, Convert.FromBase64String(salt), 10000);
byte[] hash = hasher.GetBytes(64);
return Convert.ToBase64String(hash);
}
public bool VerifyPasswordHash(string salt, string password, string hash)
{
return HashPassword(salt, password) == hash;
}
public string GenerateSalt()
{
int max_length = 32;
byte[] salt = new byte[max_length];
random.GetBytes(salt);
return Convert.ToBase64String(salt);
}
}
谢谢大家! 当然,它将以==结束,您将编码为Base64!:)。Base64中的所有内容都以==结尾。当然,它将以==结尾,您正在编码到Base64!:)。Base64中的所有内容都以==结尾。这不太正确。填充一个块所需的
=
。(4个基本64个字符/3个字节)(即零、一个或两个=
),因此这不是我的实现中的错误,而是字符串转换的产物?我不明白。C#将字符串存储为16位UTF8。这不是可以平均分割的吗?我想这里有一些我不理解的地方。我们所说的(并且@Tibrogargan稍微更正了答案)是,对于Base64,您将得到填充class='s的填充,以填充到块中。因此,可以在Base64字符串的末尾以0、1或2='s结尾。这是正常的。@Dabloons-存储为UTF-16的字符串完全不在这里。首先,Base64编码器不是采用字符串,而是采用原始字节序列。其次,Base64将3个字节的输入转换为4个字符的输出。您的输入总是64个字节,因此前63个字符总是有21个块,剩下1个字节。这就是为什么在结尾处得到2==的原因,因为它填充了2个字节来生成第22个块。这不太正确。填充一个块所需的=
。(4个基本64个字符/3个字节)(即零、一个或两个=
),因此这不是我的实现中的错误,而是字符串转换的产物?我不明白。C#将字符串存储为16位UTF8。这不是可以平均分割的吗?我想这里有一些我不理解的地方。我们所说的(并且@Tibrogargan稍微更正了答案)是,对于Base64,您将得到填充class='s的填充,以填充到块中。因此,可以在Base64字符串的末尾以0、1或2='s结尾。这是正常的。@Dabloons-存储为UTF-16的字符串完全不在这里。首先,Base64编码器不是采用字符串,而是采用原始字节序列。其次,Base64将3个字节的输入转换为4个字符的输出。您的输入总是64个字节,因此前63个字符总是有21个块,剩下1个字节。这就是为什么在最后会得到2==的原因,因为它填充了2个字节来生成第22个块。最后一步是将其转换为字符串。下一个问题是通过电线传输这些字符串。您需要通过将“+”转换为“-”和“/”转换为“\u1”,将转换为。有关更多信息,请参阅。哈希可能重复。哈希没有问题。最后一步是将其转换为字符串。下一个问题是通过电线传输这些字符串。您需要通过将“+”转换为“-”和“/”转换为“\u1”,将转换为。有关详细信息,请参阅。的可能重复项