Какую кодировку я могу использовать для сжатия числа, которое безопасно для URL и cookie? - PullRequest
2 голосов
/ 16 ноября 2011

Я пытаюсь найти способ разместить число в URL-адресе и / или файле cookie, и в настоящее время единственный метод, который у меня есть, - это использование обычного шестнадцатеричного кодирования (00-01-...-FF). Я собирался использовать Base64, но обнаружил, что это небезопасно в URL или куки.

Какая кодировка похожа на base64, которую я могу использовать, это безопасно для URL и cookie? (используя только 0-9, a-z, A-Z) Кроме того, бонусные баллы за то, что они являются кодером / декодером для кодирования в библиотеке .Net :)

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Почему бы не использовать Base64, но преобразовать символы + и / в - и _ соответственно?См. http://en.wikipedia.org/wiki/Base64#Variants_summary_table для описания.

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

Этот код превращает 64-битное значение в base64закодированный ключ, используя это преобразование:

    public static string Base64EncodeKey(ulong key)
    {
        // get bytes
        byte[] keyBytes = BitConverter.GetBytes(key);

        // get base64 value
        string keyString = Convert.ToBase64String(keyBytes);

        // The base64 encoding has a trailing = sign, and + and - characters.

        // Strip the trailing =.
        keyString = keyString.Substring(0, keyString.Length - 1);

        // convert + to - (dash) and / to _ (underscore)
        keyString = keyString.Replace('+', '-');
        keyString = keyString.Replace('/', '_');

        return keyString;
    }

Обратное преобразование закодированного ключа обратно в ulong:

    public static ulong Base64DecodeKey(string keyString)
    {
        // convert - to +, and _ to /
        keyString = keyString.Replace('-', '+');
        keyString = keyString.Replace('_', '/');

        // add the trailing =
        keyString += '=';

        // convert to bytes
        byte[] keyBytes = Convert.FromBase64String(keyString);

        // get the encoded key
        ulong encodedKey = BitConverter.ToUInt64(keyBytes, 0);
        return encodedKey;
    }

Вы можете сделать нечто подобное с 32-битными ключами.

Обновление:

Я вижу, что вы сказали, что количество байтов различно.Если вы знаете, что значение всегда составляет 32 бита или меньше (или 64 бита или меньше), вам, вероятно, лучше использовать технику, которую я описал выше.Если вам действительно нужно кодировать строку переменной длины, вы все равно можете использовать модифицированную схему кодирования base64, которая заменяет + и / на - и _.См. RFC 4648 для других рекомендаций.

0 голосов
/ 14 января 2015

Для простого способа сделать это используйте HttpServerUtility.UrlTokenEncode () и UrlTokenDecode ().

byte[] plainTextBytes = Encoding.UTF8.GetBytes(originalString);
string encodedString = HttpServerUtility.UrlTokenEncode(plainTextBytes);


byte[] decodedBytes = HttpServerUtility.UrlTokenDecode(encodedString);
string originalStringCopy = Encoding.UTF8.GetString(decodedBytes);

Спасибо Фредрику Хаглунду за его ответ здесь: https://stackoverflow.com/a/1789179/24315

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...