-1
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

3 回答 3

1

这只是您无法避免的 Base64 填充,请参见此处。另请参阅Base64 规范

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

于 2018-08-31T14:39:25.570 回答
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();
}
于 2020-02-25T08:52:15.873 回答
0

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

根据文档

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

所以,我可以想到三个选项:

  1. 停止使用 base-64 格式(可能返回字节本身)。
  2. =接受 base-64用于填充的事实。
  3. 传递一个不需要填充的长度,比如 9。

第 3 点的示例:

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

生产

AQIDBAUGBwgJ
于 2018-08-31T14:46:29.737 回答