Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# RNGCryptoServiceProvider随机字符串。始终返回以'=';_C#_Random_Rngcryptoserviceprovider - Fatal编程技术网

C# RNGCryptoServiceProvider随机字符串。始终返回以'=';

C# RNGCryptoServiceProvider随机字符串。始终返回以'=';,c#,random,rngcryptoserviceprovider,C#,Random,Rngcryptoserviceprovider,因此,如果salt长度为8,它将返回一些随机字符串,但以“=”结尾,如何避免它?查看了其他堆栈溢出解决方案,但仍然无法修复它这只是Base64填充,您无法避免,请参阅。另见 我建议使用salt作为字节数组。问题与使用RNGCryptoServiceProvider无关,而是将结果转换为base-64 根据报告: 无值字符“=”用于尾随填充 因此,我可以想出三种选择: 停止使用base-64格式(可能返回字节本身) 接受base-64使用=填充的事实 传递一个不需要填充的长度,如9 第3点的例子:

因此,如果salt长度为8,它将返回一些随机字符串,但以“=”结尾,如何避免它?查看了其他堆栈溢出解决方案,但仍然无法修复它

这只是Base64填充,您无法避免,请参阅。另见


我建议使用salt作为字节数组。

问题与使用
RNGCryptoServiceProvider
无关,而是将结果转换为base-64

根据报告:

无值字符“=”用于尾随填充

因此,我可以想出三种选择:

  • 停止使用base-64格式(可能返回字节本身)
  • 接受base-64使用
    =
    填充的事实
  • 传递一个不需要填充的长度,如9
  • 第3点的例子:

    static public string GetRandomSalt(int saltLength)
        {
            byte[] saltByte = new byte[saltLength];
    
            using (var random = new RNGCryptoServiceProvider())
            {
    
                random.GetBytes(saltByte);
            }
            return Convert.ToBase64String(saltByte);
        }
    
    产生

    Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})
    
    你不能解决它。您已经创建了一个base-64编码字符串,大概是为了传递给将对其进行base-64解码的某个对象/其他人(如果没有,为什么要进行转换?)。当他们解码时,他们希望
    =
    在那里。
    AQIDBAUGBwgJ
    
    public static string GetUniqueKey(int maxSize)
    {
        char[] chars = new char[62];
        chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
        byte[] data = new byte[1];
        using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
        {
            crypto.GetNonZeroBytes(data);
            data = new byte[maxSize];
            crypto.GetNonZeroBytes(data);
        }
        StringBuilder result = new StringBuilder(maxSize);
        foreach (byte b in data)
        {
            result.Append(chars[b % (chars.Length)]);
        }
        return result.ToString();
    }