libsodium: криптографическая библиотека, устойчивая к ошибкам использования
Изучите продуманное API libsodium, которое затрудняет выбор небезопасных параметров.
«libsodium: криптографическая библиотека, устойчивая к ошибкам использования» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.
Философия и происхождение libsodium
libsodium была создана Фрэнком Денисом как переносимая кроссплатформенная сборка библиотеки NaCl (сетевой и криптографической библиотеки), разработанной Daniel Bernstein, Tanja Lange и Peter Schwabe. Основная философия заключается в том, чтобы сделать правильное использование криптографии максимально простым, а неправильное — максимально сложным. Безопасные значения по умолчанию, простые программные интерфейсы и заранее выбранные алгоритмы предотвращают распространённые ошибки, характерные для низкоуровневых библиотек.
Аутентифицированное шифрование с секретным ключом
crypto_secretbox предоставляет аутентифицированное шифрование с секретным ключом на основе XSalsa20-Poly1305. Программный интерфейс принимает сообщение, 24-байтовое одноразовое число (сгенерированное случайным образом) и 32-байтовый ключ. Результатом является шифртекст, который одновременно зашифрован и аутентифицирован. crypto_secretbox_open атомарно расшифровывает данные и проверяет тег аутентификации, возвращая ошибку при обнаружении вмешательства. Это предотвращает расшифрование поврежденного или злонамеренно измененного шифртекста.
Аутентифицированное шифрование с открытым ключом
crypto_box предоставляет аутентифицированное шифрование с открытым ключом между двумя сторонами на основе X25519-XSalsa20-Poly1305. Получив закрытый ключ отправителя и открытый ключ получателя, функция шифрует сообщение и добавляет к нему аутентификацию, поэтому расшифровать его может только предназначенный получатель, а получатель может проверить личность отправителя. crypto_box_seal — это анонимный вариант: отправитель скрыт, обеспечивается только шифрование, но не аутентификация отправителя.
Цифровые подписи с Ed25519
crypto_sign реализует цифровые подписи с использованием Ed25519. При генерации ключей создаются 64-байтовый закрытый ключ (фактически объединение начального значения и открытого ключа) и 32-байтовый открытый ключ. При подписании создается 64-байтовая подпись. Проверка выполняется быстро и за постоянное время. Подписи Ed25519 детерминированы: одно и то же сообщение с одним и тем же ключом всегда дает одну и ту же подпись. Это устраняет уязвимости, связанные со сбоями генерации случайных чисел, которые в некоторых реализациях затрагивали ECDSA.
Хеширование с BLAKE2b
crypto_generichash предоставляет хеширование общего назначения с использованием BLAKE2b. В отличие от SHA-256, BLAKE2b не требует отдельной конструкции HMAC для хеширования с ключом: он принимает необязательный ключ напрямую. Длину результата можно настроить от 16 до 64 байтов. На современных 64-битных процессорах BLAKE2b работает быстрее SHA-256 и SHA-512, обеспечивая при этом аналогичные или более высокие свойства безопасности.
Выведение ключей с BLAKE2b
crypto_kdf выполняет выведение ключей из главного ключа с использованием BLAKE2b. Получив 32-байтовый главный ключ, строку контекста (8 байтов, идентифицирующих назначение) и ID производного ключа (64-битное число), функция выводит криптографически независимый производный ключ настраиваемой длины. Это позволяет получать из одного главного ключа несколько независимых ключей для разных целей без какой-либо связи между производными ключами.
Хеширование паролей с Argon2id
crypto_pwhash предоставляет хеширование паролей с использованием Argon2id — победителя конкурса Password Hashing Competition. Argon2id сочетает вычисления с высокой потребностью в памяти, устойчивые к атакам с использованием GPU, с вычислениями, требующими значительного времени и устойчивыми к атакам с использованием ASIC. Параметры включают ограничение числа операций (затраты времени) и ограничение объема памяти; их можно настроить в соответствии с требованиями безопасности. crypto_pwhash_str создает стандартную строку, подходящую для хранения и содержащую алгоритм и его параметры.
Запечатанные контейнеры для анонимного шифрования
crypto_box_seal шифрует сообщение для получателя, не раскрывая отправителя. Функция создает временную эфемерную пару ключей, выполняет обмен ключами с использованием открытого ключа получателя, а затем удаляет эфемерный закрытый ключ. Получатель может расшифровать сообщение с помощью своего закрытого ключа, но не может установить личность отправителя. Такой подход подходит для систем анонимной отправки данных и односторонних зашифрованных каналов.
Языковые привязки libsodium
libsodium имеет привязки практически для всех основных языков программирования. PyNaCl предоставляет идиоматичные привязки для Python с исключениями в стиле Python и объектами байтов. libsodium-wrappers предоставляет привязки для JavaScript/Node.js (WASM для браузеров). libsodium.js — это реализация на чистом JavaScript. Качество привязок различается: выбирайте официальные или широко поддерживаемые привязки, которые используют библиотеку C, а не реализуют алгоритмы заново.
Сравнение с низкоуровневым программным интерфейсом OpenSSL
Низкоуровневый программный интерфейс OpenSSL требует явно выбирать алгоритмы, размеры ключей, режимы, дополнение и способ управления векторами инициализации. Некорректные сочетания принимаются без предупреждения. libsodium предоставляет одну корректную реализацию для каждого варианта использования, не требующую настройки. Например, при шифровании с OpenSSL нужно выбрать шифр, режим, выведение ключа, генерацию вектора инициализации и дополнение; при использовании crypto_secretbox из libsodium достаточно передать ключ, одноразовое число и сообщение, а все остальное будет обработано правильно.
Выбор libsodium для новых проектов
libsodium — рекомендуемая отправная точка для любого проекта, которому требуются криптографические операции на поддерживаемых языках. Небольшой программный интерфейс снижает вероятность неправильного использования, алгоритмы являются современными и тщательно изученными, а кроссплатформенная реализация на C тщательно протестирована. Переход на низкоуровневую библиотеку, такую как OpenSSL, нужен только при необходимости использовать определенные алгоритмы, недоступные в libsodium, или пройти проверку соответствия FIPS 140-2.
Операции libsodium
Какую функцию libsodium следует использовать для хеширования пароля перед его хранением в базе данных?
Повторение материала по libsodium
Повторение материала по libsodium: безопасные значения по умолчанию и программный интерфейс, которым сложно неправильно воспользоваться; библиотека построена на примитивах NaCl, разработанных Bernstein и его коллегами; crypto_secretbox предназначен для шифрования с секретным ключом (XSalsa20-Poly1305), crypto_box — для шифрования с открытым ключом (X25519), crypto_sign — для подписей Ed25519, crypto_generichash — для хеширования BLAKE2b, crypto_pwhash — для хеширования паролей с Argon2id, запечатанные контейнеры — для анонимного шифрования, а языковые привязки — для большинства основных платформ.
Часто задаваемые вопросы
Урок «libsodium: криптографическая библиотека, устойчивая к ошибкам использования» бесплатный?
Да — полный текст урока «libsodium: криптографическая библиотека, устойчивая к ошибкам использования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.
Чему я научусь в уроке «libsodium: криптографическая библиотека, устойчивая к ошибкам использования»?
Изучите продуманное API libsodium, которое затрудняет выбор небезопасных параметров. Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cryptology Academy?
Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «libsodium: криптографическая библиотека, устойчивая к ошибкам использования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cryptology Academy?
Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- libsodium: криптографическая библиотека, устойчивая к ошибкам использования
- API OpenSSL: основные структуры и подводные камни
- Google Tink: безопасная высокоуровневая криптография
- Аудит и выбор криптографических зависимостей