Неверная длина для массива Base-64 во время расшифровки - PullRequest
0 голосов
/ 25 июня 2018

У меня очень странная проблема, и я понятия не имею, что может быть причиной.

Клиент сегодня утром отправил мне электронное письмо о том, что некоторые клиенты получают сообщение об ошибке при попытке просмотра его веб-сайта, он также получил сообщение об ошибке, но затем, при повторной попытке, это сработало.

Глядя на логи, ошибка с Chrome 65 и 67, я использую 67 и не получаю ошибку.

Ниже приведена строка запроса, которая зашифрована, для клиента она никогда не работала, а для меня работала:

AQAAANCMnd8BFdERjHoAwE% 2fCl% 2bsBAAAA0PyFDdX% 2brkGTpXZG7C49nAQAAAACAAAAAAAQZgAAAAEAACAAAACI39m3OhUEFw3GBxXP% 2bsVpw6zLJOqRkcJx1% 2bFPcozLZgAAAAAOgAAAAAIAACAAAAAJpDYiaxnPjDprOQEA9u02% 2bU0% 2fDQDCIF7sXsjxaU3onYAAAACWWCv% 2bKNSRbQjLTNeJjgE37yHviV1UmfJyoUn% 2fcUg% 2f0MTr23% 2b16qZs9F% 2fDNm4wU% 2bJITVn3xXuarzcNB6ClJ2ZpwtEsMdUNBRUW0B7XA9% 2bQjC69V1O2XqTp% 2fgXQazHOITEBpgokD1tSbnv4pRMUfkVlogYoo0H9Lnf24FEDEnSp30AAAACwtnrmVACY71% 2bcAAMANRoCuihUumid0i8P75KV0ZlUIRBXyOzASHwq9I7icvXWDbI2nNOa0mQDOgNdvZEti% 2bYz

Ниже приведен мой код, я надеюсь, что проблема в этом, но, поскольку у некоторых клиентов есть проблема, а у некоторых нет, я не задерживаю дыхание.

var encrtptUserId = EncryptionDecryption.WindowsEncrypted(encryptQueryParameters);

string urlToValidateUser = $"{baseUrl}?id={HttpUtility.UrlEncode(encrtptUserId)}";

public static string WindowsEncrypted(string text)
{
    return Convert.ToBase64String(ProtectedData.Protect(Encoding.Unicode.GetBytes(text), null, DataProtectionScope.LocalMachine));
}

public static string WindowsDecrypted(string text)
{
    return Encoding.Unicode.GetString(ProtectedData.Unprotect(Convert.FromBase64String(text), null, DataProtectionScope.LocalMachine));            
}

Проблема связана с дешифрованием, но не всегда

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 25 июня 2018

Строка запроса включает в себя закодированные значения, например, "% 2b". Это по крайней мере неудобно.

Вы можете декодировать эти значения, чтобы в итоге получить исходное значение base64, которое затем можно преобразовать обратно в байтовый массив. но для начала было бы лучше использовать безопасную для сети кодировку base64.

Convert.ToBase64String не обеспечивает безопасного для URL подхода, но вы можете легко использовать Replace для результата:

public static string WindowsEncrypted(string text)
{
    byte[] plainBinary= Encoding.Unicode.GetBytes(text);
    byte[] encrypted = ProtectedData.Protect(plainBinary, null, DataProtectionScope.LocalMachine);
    string base64 = Convert.ToBase64String(encrypted);
    // Return a url-safe string
    return base64.Replace("+", "-").Replace("/", "_").Replace("=", ".");
}

public static string WindowsDecrypted(string text)
{
    string base64 = text.Replace("-", "+").Replace("_", "/").Replace(".", "=");
    byte[] encrypted = Convert.FromBase64String(base64);
    byte[] plainBinary = ProtectedData.Unprotect(encrypted, null, DataProtectionScope.LocalMachine);
    return Encoding.Unicode.GetString(plainBinary);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...