Веб-разработка не может выжить без шифрования

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

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

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

В качестве первого шага мы должны понять, что такое криптография (и шифрование) и как оно работает.

Что такое криптография?

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

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

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

Что такое шифрование?

Хотя эти термины (шифрование и криптография) иногда используются как синонимы, это не одно и то же.

Шифрование - это процесс преобразования открытого текста в зашифрованный с использованием алгоритма. Это только один аспект криптографии. Противоположность шифрования - процесс преобразования зашифрованного текста обратно в открытый текст - называется дешифрованием.

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

Типы криптографии

Существует три основных типа криптографии:

  • Криптография с симметричным ключом
  • Криптография с асимметричным ключом
  • Хеширование

Давайте посмотрим, насколько важен каждый из них для защиты данных.

Криптография с симметричным ключом

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

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

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

Криптография с асимметричным ключом

Криптография с асимметричным ключом была введена для преодоления проблем безопасности, связанных с криптографией с симметричным ключом. Он использует пару ключей (вместо одного), которые называются открытым ключом и закрытым ключом. Открытый ключ используется только для шифрования данных. Закрытый ключ используется только для расшифровки данных. Вы не можете использовать открытый ключ для расшифровки данных, зашифрованных с его помощью, и наоборот.

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

Хеширование

Хеширование отличается от двух предыдущих типов криптографии.

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

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

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

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

Шифрование с помощью Node.js

Node.js имеет встроенный модуль шифрования, который предоставляет функции для выполнения криптографических операций. Он включает набор оболочек для функций OpenSSL hash, HMAC, cipher, decipher, sign и verify.

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

Шифрование данных с помощью Node.js

Мы можем использовать класс Cipher модуля шифрования для шифрования данных. Итак, реализуем функцию шифрования:

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

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

Мы использовали алгоритм шифрования 192-битный (24 байта) алгоритм AES (Advanced Encryption Standard). Здесь 192 бита указывают длину ключа. Вы можете видеть, как мы передали длину ключа 24 в функцию генерации ключей scrypt.

При создании нового объекта cipher мы передаем параметр, называемый вектором инициализации (IV). Обычно он добавляется к зашифрованному тексту без процесса шифрования. Он используется, чтобы избежать повторов в зашифрованном тексте, чтобы злоумышленники не могли расшифровать данные, идентифицируя шаблоны в зашифрованных данных. Следовательно, IVs всегда должен быть непредсказуемым и уникальным. По этой причине эта реализация генерирует новый IV с помощью функции randomFill.

Наконец, шифрование данных выполняется с помощью функции write. Объект cipher запускает событие «данные» всякий раз, когда часть данных становится доступной из зашифрованного потока данных, и этот фрагмент затем добавляется к зашифрованной строке. Мы можем определить, когда шифрование завершится, запустив событие “end”. Мы используем другое событие “error” для обнаружения ошибок, возникающих при шифровании текста.

Расшифровка данных с помощью Node.js

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

Чтобы расшифровать зашифрованный текст, вам необходимо передать IV, используемый для шифрования данных в функции encrypt.

Хеширование с помощью Node.js

Реализовать функцию hash с помощью криптографии довольно просто. Вот созданная нами hash функция:

sha256 - алгоритм хеширования, который мы использовали в этой реализации. Используя этот алгоритм, он может легко создать хэш-текст с функцией write. Когда хешированные данные доступны в потоке, он запускает событие “readable”, и мы можем получить хеш-строку.

Резюме

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

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

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