И как обезопасить свои данные.

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

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

Симметричное шифрование - один из таких методов, и в этом уроке я покажу вам, как это сделать в Go.

Примечание. В этом руководстве используется версия Go 1.14.7.

Вступление

Шифрование с симметричным ключом - это метод, используемый для шифрования сообщения, в котором есть только один секретный ключ. Этот ключ используется в обеих частях процесса, то есть для шифрования и дешифрования сообщения.

Используя любой алгоритм с симметричным ключом, сообщение преобразуется в непонятную форму. Если только у кого-то нет секретного ключа. В этом случае и отправитель, и получатель имеют один и тот же ключ (обмен которым осуществляется безопасным способом), поэтому они могут отправлять сообщения и понимать друг друга.

Используемый алгоритм определяет размер ключа и режим, в котором выполняется процесс шифрования или дешифрования. И, как правило, чем длиннее ключ, тем сложнее его взломать и надежнее шифрование. Например, для взлома 128-битного ключа обычным компьютером может потребоваться до миллиардов лет.

Есть два типа алгоритмов:

  • Блок: сообщение шифруется с использованием блоков фиксированного размера. Пример: DES, AES и т. Д.
  • Поток: сообщение шифруется отдельными символами. Пример: RC4, Salsa20 и т. Д.

Режимы

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

Для большинства режимов требуется уникальная начальная последовательность, часто называемая вектором инициализации (IV). IV должен быть неповторяющимся, а иногда и случайным.

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

  • ЕЦБ: самый простой. Зашифруйте каждый блок отдельно. Этот режим совершенно небезопасен, и его не следует использовать.

  • CBC: в этом режиме каждый блок исходного сообщения подвергается операции XOR с предыдущим зашифрованным блоком перед шифрованием.

  • CFB / OFB / CTR: эти режимы превращают блочный шифр в потоковый шифр, используя блок сообщения только после части шифрования.
  • XTS: используется для кодирования произвольно доступных данных (например, жесткого диска или RAM).

Аутентификация сообщения

Чтобы повысить безопасность сообщения, добавляется небольшая информация для его аутентификации. Другими словами, он подтверждает, что сообщение действительно пришло от отправителя и не было изменено.

Эта информация называется кодом аутентификации сообщения (MAC) и защищает целостность данных сообщения, а также его подлинность. Есть много алгоритмов, реализующих это, таких как HMAC, GCM и др.

Шифрование

Процесс шифрования файла с помощью Go прост. Используя пакет crypto, мы можем сделать все необходимые шаги для шифрования файла.

Первый шаг - открыть файл и прочитать его содержимое.

Следующим шагом будет создание блока для нашего алгоритма. Этот объект реализует реальный код, поэтому нам не о чем беспокоиться. В этом уроке мы собираемся использовать AES.

Ключ должен быть 16 байтов (AES-128), 24 байта (AES-192) или 32 байта (AES-256), которые мы читаем из файла.

Примечание: Никогда не сохраняйте ключ в коде.

Как упоминалось выше, есть несколько режимов, в которых вы можете зашифровать свое сообщение. Для нашего удобства в пакете crypto/cipher уже реализованы некоторые из них.

Мы собираемся использовать режим GCM, то есть потоковый режим с аутентификацией. Таким образом, нам не нужно беспокоиться о заполнении или аутентификации, поскольку это уже сделано пакетом.

Для этого режима требуется массив nonce. Он работает как IV. Убедитесь, что это не одно и то же значение, то есть меняйте его каждый раз при шифровании, даже если это один и тот же файл. Вы можете сделать это со случайным значением, используя пакет crypto/rand.

Для шифрования данных используем функцию Seal. Он зашифрует файл, используя режим GCM, добавив nonce и tag (значение MAC) к окончательным данным, чтобы мы могли использовать его для расшифровки позже.

После этого нам просто нужно сохранить зашифрованный текст в наш целевой файл.

Вот и все! Вы зашифровали файл. И полный код:

Расшифровка

Чтобы расшифровать файл, процесс в основном тот же. Вместо этого нам нужно прочитать зашифрованный файл.

Создание ключа и блока режима такое же, как и в процессе шифрования. Убедитесь, что вы используете тот же ключ, что и для шифрования, поскольку это алгоритм с симметричным ключом.

Для расшифровки нашего файла воспользуемся функцией Open. Необходимо указать значение nonce, которое мы использовали в процессе шифрования. В нашем процессе шифрования это значение сохраняется в начале файла.

Наконец, нам просто нужно сохранить наш расшифрованный контент в файл.

Шифрование больших файлов

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

Для этого мы сначала открываем файл, который хотим зашифровать, с помощью функции os.Open.

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

Мы можем использовать режим CTR, так как это потоковый режим и очень близок к GCM. В этом режиме также требуется IV того же размера, что и блок (для AES, 16 байт).

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

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

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

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

Расшифровка больших файлов

Чтобы его расшифровать, нам нужно лишь кое-что изменить: прочитать IV из файла вместо случайного значения. Это значение сохраняется в конце файла, поэтому его легко читать.

В режиме CTR процессы шифрования и дешифрования одинаковы, поэтому нам фактически не нужно ничего менять.

Полный код части расшифровки:

Важно отметить, что мы не использовали никаких форм аутентификации. Это легко сделать с помощью пакета crypto/hmac. После того, как значение MAC рассчитано, вы можете добавить его в файл назначения. Для процесса дешифрования вы должны прочитать его и сравнить с новым вычислением, которое вы выполняете.

Заключение

Шифрование файла с использованием языка Go несложно с использованием пакета crypto.

Если вам также интересно, как создать хеш с помощью Go, ознакомьтесь с другой статьей:



Подпишитесь на меня в Twitter, если хотите получать больше статей о программировании.