Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成的密码散列后面总是跟一个'==';_C#_Asp.net_Hash_Passwords - Fatal编程技术网

C# 生成的密码散列后面总是跟一个'==';

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

在我的应用程序中,我有一个对密码进行哈希运算并生成盐的类。出于某种原因,每个哈希似乎总是以双等号(=)结尾

我做错什么了吗?这些散列不安全吗

应用程序在c#和asp.net中,生成salt和hash的代码如下所示

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”,将转换为。有关详细信息,请参阅。的可能重复项