Кодирование Base64 и C#


Если вы хоть раз делали какой-нибудь долгосрочный проект в веб-индустрии, то наверняка вам попадался на глаза термин «кодирование Base64». Base64 – это такой формат шифрования, который используется браузерами. Например, для реализации проверки подлинности вводимых данных в форму пароля и логина.

Однако, если вы поинтересуетесь мнением какого-либо специалиста о том, можно ли использовать это шифрование для серьезной защиты, то он просто посмеется. Base64 – двусторонний шифр; так что, если у вас есть оригинальная фраза, то можно просто применить его обратно и получить исходный текст.

Ладно, но если Base64 такой хлам, зачем я рассказываю вам об этом?

Ну, на самом деле, у кодировки Base64 есть еще одно очень хорошее применение. Она отлично подходит для кодирования сложных двоичных файлов и данных в очень простое текстовое представление, которое передается исключительно легко с помощью текстовых протоколов, таких как HTTP.

Подожди. Но HTTP обеспечивает передачу двоичных данных, правильно?

Да это так, но давайте представим на минуту, что вы хотите попытаться сохранить несколько запросов в вашем последнем проекте ASP.NET MVC. Что вы могли бы это сделать, надо вставлять изображения непосредственно в веб-страницы, а затем передавать их все в то же время при доставке исходную страницу. Если у вас появились сомнения по поводу достоверности этой схемы, посмотрите на исходный код для текущей страницы поиска Google. Вы увидите что-то вроде этого:


Рис. 1: Поиск Google использует кодировку Base64 для изображений

Обратите особое внимание на раздел в красном прямоугольнике. Это логотип Google, который отображается на странице, когда вы загрузите её. На самом деле, если вы посмотрите в веб-отладчик при загрузке страницы, вы увидите, что каждый раз логотип Google загружается из кэша на высокой скорости. Поскольку изображения в основном загружены на страницу, на дисплее происходит мгновенно, когда ваш браузер загружает вид.

То, что на то вы смотрите, называется кодированными в Base64URL данными. Это новая вещь, которая была введена в HTML5, и вы можете использовать её не только для изображений, но и для CSS-файлов и JavaScript. Где-нибудь в вашем HTML/MVC вьювере можно указать любые URL, вы можете использовать URL данные.

Интересно, что в .NET имеется очень простая в использовании процедура для генерации этих строки Base64. Поскольку строки представляют собой простой текст, вы также можете легко отправить их с помощью любых услуг по передаче текста, например, SMS.

Запустите Visual Studio, и начните новый проект в режиме консоли. Файл "Program.cs" заполните так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace upRead
{
    class Program
    {
        static void Main(string[] args)
        {
            string simpleText = "Хорошо живет на свете Винни Пух!";
            var simpleTextBytes = Encoding.UTF8.GetBytes(simpleText);
            string enText = Convert.ToBase64String(simpleTextBytes);

            Console.WriteLine("Простой текст: {0}", simpleText);
            Console.WriteLine("Кодированный текст: {0}", enText);
            Console.ReadKey();
        }
    }
}
Когда вы выполните это, вы должны увидеть нечто вроде следующего:


Рис. 2: Тест кодирования Base64

Расшифровка строки обратно так же проста:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace upRead
{
    class Program
    {
        static void Main(string[] args)
        {
            string enText = "0KXQvtGA0L7RiNC+INC20LjQstC10YIg0L3QsCDRgdCy0LXRgtC1INCS0LjQvdC90Lgg0J/Rg9GFIQ==";
            var enTextBytes = Convert.FromBase64String(enText);
            string deText = Encoding.UTF8.GetString(enTextBytes);

            Console.WriteLine("Кодированный текст: {0}", enText);
            Console.WriteLine("Раскодированный текст: {0}", deText);
            Console.ReadKey();
        }
    }
}

Рис. 3: Тест декодирования Base64

Если вы посмотрите на эти два примера кода, то вы увидите, что они работают с массивами байтов. Мы преобразовываем строку в байты, затем кодируем её, а декодер принимает строку и создает массив байт, содержащий декодированное содержимое.

Это означает, что кодирование и декодирование файла так же просто, как и строки:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace upRead
{
    class Program
    {
        static void Main(string[] args)
        {
            var fB = File.ReadAllBytes(@"C:\rab\kot.jpg");
            string encodedFile = Convert.ToBase64String(fB);
            Console.WriteLine("Base 64 Encoded File : {0}", encodedFile);

            var dFB = Convert.FromBase64String(encodedFile);
            File.WriteAllBytes(@"C:\rab\newkot.jpg", dFB);
            Console.ReadKey();
        }
    }
}
Как вы можете видеть, однако, здесь получается большое количество данных.


Рис. 4: Осторожно; при кодировании в base64 на выводе получаются большие объемы данных.

Компромиссом здесь является то, что вы получаете мгновенную загрузку изображений в обмен на несколько больший размер страницы. Так что это не самый лучший способ для "тяжелых" изображений. А наибольший эффект будет достигнут, если ваш веб-сервер сжимает информацию перед отправкой. Из-за своих особенностей Base64 сжимает очень эффективно, так что объем данных, которые отправляются, будет очень небольшим.

Эффективно использовать этот метод для небольших изображений, таких как иконки и логотипы, например, для пользовательского интерфейса. Но помните, что не стоит им злоупотреблять - это инструмент для "точечной" работы.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, Base64, .NET




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Разные статьи
Анализ алгоритмов: математические модели
Что плохого в классах-обертках чисел на Java?