RNGCryptoServiceProvider随机字符串。始终返回以'='结尾的字符串

时间:2018-08-31 14:34:01

标签: c# random rngcryptoserviceprovider

static public string GetRandomSalt(int saltLength)
    {
        byte[] saltByte = new byte[saltLength];

        using (var random = new RNGCryptoServiceProvider())
        {

            random.GetBytes(saltByte);
        }
        return Convert.ToBase64String(saltByte);
    }

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

4 个答案:

答案 0 :(得分:1)

您只能避免使用Base64填充,请参见here。另请参见Base64 specification

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

答案 1 :(得分:0)

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

根据documentation

  

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

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

  1. 停止使用base-64格式(可能自己返回字节)。
  2. 接受base-64使用=进行填充的事实。
  3. 传递不需要填充的长度,例如9。

第3点示例:

Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})

产生

AQIDBAUGBwgJ

答案 2 :(得分:0)

等号正在填充。当您转换为base64字符串的字节数不是三的倍数时,将添加此填充。

基本上是这样的:

number of bytes % 3 == 0 -> no padding
number of bytes % 3 == 1 -> == padding
number of bytes % 3 == 2 -> = padding

答案 3 :(得分:0)

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();
}