为什么RNGCryptoServiceProvider值始终以等号结束?

时间:2012-02-03 16:46:40

标签: c# cryptography passwords base64 password-protection

这是我的方法:

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没有在链接末尾拾取=。有没有人知道如何解决这个问题,而不是简单地砍掉字符串的最后一个字符?

1 个答案:

答案 0 :(得分:10)

它与返回的字节数有关。 =用作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

我意识到我解释了为什么会出现这种情况,但从未建议过另一种方法来生成您的网址参数。一种这样的方法是System.Web.HttpServerUtility.UrlTokenEncode()方法,它将字节数组转换为url友好格式。要将字符串转换回字节数组,请使用System.Web.HttpServerUtility.UrlTokenDecode()方法。