为了账号安全,请及时绑定邮箱和手机立即绑定

RNGCryptoServiceProvider 随机字符串。总是返回以 '=' 结尾的字符串

RNGCryptoServiceProvider 随机字符串。总是返回以 '=' 结尾的字符串

C#
叮当猫咪 2021-12-25 18:36:44
static public string GetRandomSalt(int saltLength)    {        byte[] saltByte = new byte[saltLength];        using (var random = new RNGCryptoServiceProvider())        {            random.GetBytes(saltByte);        }        return Convert.ToBase64String(saltByte);    }因此,如果盐长度为 8,它将返回一些随机字符串,但以“=”结尾,我该如何避免呢?查看了其他堆栈溢出解决方案,但仍然无法修复它
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-12-25
?
繁星coding

TA贡献1797条经验 获得超4个赞

问题与 的使用无关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


查看完整回答
反对 回复 2021-12-25
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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

}


查看完整回答
反对 回复 2021-12-25
  • 3 回答
  • 0 关注
  • 282 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信