Недопустимая длина для Основы 64 массива символов

Как в заголовке говорится, я добираюсь:

Недопустимая длина для Основы 64 массива символов.

Я читал об этой проблеме на здесь, и кажется, что предложение состоит в том, чтобы сохранить ViewState в SQL, если это является большим. Я использую мастер с большим сбором данных, таким образом, возможностями является мой ViewState, является большим. Но, прежде чем я обращаюсь к решению "хранилища в DB", возможно, кто-то может смотреть и сказать мне, если у меня есть другие опции?

Я создаю электронную почту для доставки с помощью ниже метода:

public void SendEmailAddressVerificationEmail(string userName, string to)
{
    string msg = "Please click on the link below or paste it into a browser to verify your email account.

" + "" + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" + userName.Encrypt("verify") + ""; SendEmail(to, "", "", "Account created! Email verification required.", msg); }

Зашифровать метод похож на это:

public static string Encrypt(string clearText, string Password)
{

    byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);

    PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });


    byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));

    return Convert.ToBase64String(encryptedData);
}

Вот то, на что HTML похож в hotmail:

Нажмите на ссылку ниже или вставьте ее в браузер для проверки почтового ящика.

http://localhost:1563/Accounts/VerifyEmail.aspx?a=YOHY57xYRENEOu3H+FGq1Rf09AZAI56EPjfwuK8XWKg=

На принимающем конце страница VerifyEmail.aspx.cs имеет строку:

 string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");

Вот метод считывания для UserNameToVerify:

public string UserNameToVerify
{
    get
    {
        return GetQueryStringValue("a").ToString();
    }
}

И вот метод GetQueryStringValue:

private static string GetQueryStringValue(string key)
{
    return HttpContext.Current.Request.QueryString.Get(key);
}

И дешифровать метод похож:

public static string Decrypt(string cipherText, string password)
{

    **// THE ERROR IS THROWN HERE!!**
    byte[] cipherBytes = Convert.FromBase64String(cipherText);

Эта ошибка может быть исправлена с кодом, фиксируют, или я должен сохранить ViewState в базе данных?

80
задан Vadim Ovchinnikov 20 January 2018 в 17:46
поделиться

3 ответа

Длина строки в кодировке base64 всегда кратна 4. Если она не кратна 4, то = символов добавляются до тех пор, пока она не станет такой. Строка запроса вида ?name=value имеет проблемы, когда value содержит = символов (некоторые из них будут отброшены, я не помню точного поведения). Возможно, вам удастся обойтись добавлением нужного количества символов = перед декодированием base64.

Edit 1

Вы можете обнаружить, что значение UserNameToVerify имеет "+"'s изменено на " "'s, так что вам может понадобиться сделать что-то вроде этого:

a = a.Replace(" ", "+");

Это должно получить правильную длину;

int mod4 = a.Length % 4;
if (mod4 > 0 )
{
    a += new string('=', 4 - mod4);
}

Конечно, вызов UrlEncode (как в ответе LukeH) должен сделать это все спорным.

183
ответ дан 24 November 2019 в 09:47
поделиться

Я предполагаю, не зная данных, что UserNameToVerify не кратно 4 по длине. Посмотрите FromBase64String на msdn.

// Ok
byte[] b1 = Convert.FromBase64String("CoolDude");
// Exception
byte[] b2 = Convert.FromBase64String("MyMan");
6
ответ дан 24 November 2019 в 09:47
поделиться

Я думаю, что вам просто нужно URL-кодировать вашу строку Base64, когда вы включаете ее в строку запроса.

В кодировке Base64 используются некоторые символы, которые должны быть закодированы, если они являются частью строки запроса (а именно + и /, и, возможно, = тоже). Если строка неправильно закодирована, вы не сможете успешно декодировать ее на другом конце, отсюда и ошибки.

Вы можете использовать метод HttpUtility.UrlEncode для кодирования вашей строки Base64:

string msg = "Please click on the link below or paste it into a browser "
             + "to verify your email account.<br /><br /><a href=\""
             + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a="
             + HttpUtility.UrlEncode(userName.Encrypt("verify")) + "\">"
             + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a="
             + HttpUtility.UrlEncode(userName.Encrypt("verify")) + "</a>";
28
ответ дан 24 November 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: