猿问

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,它将返回一些随机字符串,但以“=”结尾,我该如何避免呢?查看了其他堆栈溢出解决方案,但仍然无法修复它


叮当猫咪
浏览 283回答 3
3回答

莫回无

这只是您无法避免的 Base64 填充,请参见此处。另请参阅Base64 规范。我建议使用 salt 作为字节数组。

繁星coding

问题与 的使用无关RNGCryptoServiceProvider,而是与您将结果转换为 base-64 相关。根据文档:无值字符“=”用于尾随填充。所以,我可以想到三个选项:停止使用 base-64 格式(可能返回字节本身)。接受 base-64=用于填充的事实。传递不需要填充的长度,例如 9。第 3 点的示例:Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})产生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();}
随时随地看视频慕课网APP
我要回答