【问题标题】:Why do RNGCryptoServiceProvider values always end with equals signs?为什么 RNGCryptoServiceProvider 值总是以等号结尾?
【发布时间】:2012-02-26 06:45:04
【问题描述】:

这是我的方法:

public static string GenerateRandomString(int bytes)
{
    var rng = new RNGCryptoServiceProvider();
    var randomBytes = new byte[bytes];
    rng.GetBytes(randomBytes);
    return Convert.ToBase64String(randomBytes);
}

生成的每个值:

即:

Qcr6OgNxkGzVebNl00Dtk7yCaz64owUx7pKEhl1Ogn4=
IGFLQB0OrReDB3P6nuZgqZIkTwTtch9Fk3Rx/DL4CgI=
UAJwLwIPYEJ9SzMAK/EMiUJ/DHhmfy6UVMM5MU6Dcpg=

总是以“=”结尾——这是为什么?

我将此作为密码重置电子邮件的随机字符串发送,但我遇到了 Microsoft Outlook 未在链接末尾选择 = 的问题。有没有人知道在不简单地切断字符串的最后一个字符的情况下解决这个问题的方法?

【问题讨论】:

  • 记住 - RNGCryptoServiceProvider 没有返回字符串;它是一系列字节 - '=' 是 base 64 编码的一个方面;通过维基百科运行它en.wikipedia.org/wiki/Base64

标签: c# cryptography passwords base64 password-protection


【解决方案1】:

这与返回的字节数有关。 = 用作 base64 的填充。

编辑

使用您的算法,我使用 1 到 20 个字节生成字符串,每行打印 1 个结果。如您所见,有些字符串以等号结尾,有些则没有。

Ng==
HAo=
g+h1
pdR+cQ==
z5bFWwc=
BilTQWCU
kXo96Jilxw==
7jc16UHgbGc=
DnLzoSDUNVfQ
6MwGWLD3ZcbfZA==
hADhg4HFdMVi1n0=
cWm2HEKs48VaoYgl
TrwxX20FmEs7o8u2ag==
WLORuUzewYDB18XFAcc=
tSnvFVVm/NZ2tkXJnB6V
McUWf0mAmM5/0Upu+eYd+w==
Eln3QPMr2VjXt4e3GsZuOXo=
DBYLTG3fDbMC5I1bnYmG/NxH
KgGhxdZjmjUypsqnbQUMCJzVrQ==
yI+3sFdzBX4Xfb2u6xuzQdS9II0=

编辑#2

我意识到我解释了 = 出现的原因,但从未提出其他生成 URL 参数的方法。其中一种方法是 System.Web.HttpServerUtility.UrlTokenEncode() 方法,它将字节数组转换为对 url 友好的格式。要将字符串转换回字节数组,请使用System.Web.HttpServerUtility.UrlTokenDecode() 方法。

【讨论】:

  • 有趣的是,我只是用自己的代码做了同样的事情。在想我可能应该提到我传递给该方法的内容。我之前通过了32。通过 33 去掉等号。根据提供的维基百科链接@Andras Zoltan,这对我来说很有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2011-06-29
  • 2010-10-01
  • 2021-03-30
  • 2019-01-31
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多