Как правильно зашифровать параметр в URL

309
21 ноября 2017, 21:00

Добрый день! Есть MVC сайт. Для просмотра некоторой информации, передаются в строке uRL 2 параметра: а) лицевой счет, б) номер телефона, таким образом:

~/?id=12343&tel=79998884565

Мне необходимо зашифровать эти параметры, чтобы никто другой не понял, что передается на сервер. Пока остановился на таком варианте: Сгенерировал ключ для шифрования и расшифровки. Шифрую таким образом:

public static string Encrypt(string stringToEncrypt, string sEncryptionKey)
    {
        byte[] key = { };
        byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 };
        byte[] inputByteArray;
        try
        {
            key = Encoding.UTF8.GetBytes(sEncryptionKey.Substring(0, 8));
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Convert.ToBase64String(ms.ToArray());
        }
        catch (System.Exception ex)
        {
            return ex.Message;
        }
    }

или же таким, без задания вектора:

public string Encrypt(string stringToEncrypt, string sEncryptionKey)
    {
        TripleDESCryptoServiceProvider DES = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
        MD5CryptoServiceProvider hashMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(sEncryptionKey));
        DES.Mode = System.Security.Cryptography.CipherMode.ECB;
        ICryptoTransform DESEncrypt = DES.CreateEncryptor();
        Buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(stringToEncrypt);
        string TripleDES = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
        return TripleDES;
    }

в принципе меня всё устраивало бы, но в разных вариантах шифрования (используя разные входящие строки номеров), получается нечто похожее "eBCBbTjZyYg+jztO/NIqvg==", при обработке контроллера в данной последовательности знак "+" заменяется на пробел. Каким образом можно сделать так,чтобы при попадании в контроллер параметр не менялся, чтобы "+" оставался и возможно другие нежелательные последовательности символов?
Или же,как то по другому шифровать, чтобы не было в шифрованном виде знаков "+/==;?&", которые могут не понравится asp.

Answer 1

Используйте HttpUtility.UrlEncode для кодирования, а HttpUtility.UrlDecode - для декодирования обратно.

var asdf1 = "eBCBbTjZyYg+jztO/NIqvg==";
var asdf2 = System.Web.HttpUtility.UrlEncode(asdf1); // eBCBbTjZyYg%2bjztO%2fNIqvg%3d%3d
var asdf3 = System.Web.HttpUtility.UrlDecode(asdf2); // eBCBbTjZyYg+jztO/NIqvg==
READ ALSO
Как получить скриншот свернутого opengl окна при помощи c#

Как получить скриншот свернутого opengl окна при помощи c#

Всем приветПодскажите пожалуйста как получить скриншот свернутого opengl окна при помощи языка c#

380
Как сделать систему чекпоинтов в Unity3D?

Как сделать систему чекпоинтов в Unity3D?

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

338
Добавить текст на GO

Добавить текст на GO

Кто - то знает как добавить текст на гэймобжект? Допустим есть сфераКак сделать чтобы текст облегал ее? Что-то типа этого, только с текстом...

343