Почему значения RNGCryptoServiceProvider всегда заканчиваются знаком равенства? - PullRequest
4 голосов
/ 03 февраля 2012

Вот мой метод:

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 Ответ

10 голосов
/ 03 февраля 2012

Это связано с количеством возвращаемых байтов.= Используется как заполнитель для base64.

EDIT

Используя ваш алгоритм, я генерировал строки, используя от 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=

EDIT # 2

Я понял, что объяснил, почему = происходит,но никогда не предлагал другой способ создания вашего параметра URL.Одним из таких способов является метод System.Web.HttpServerUtility.UrlTokenEncode () , который преобразует массив байтов в удобный для URL формат.Чтобы преобразовать строку обратно в массив байтов, используйте метод System.Web.HttpServerUtility.UrlTokenDecode () .

...