LINUX.ORG.RU

gpg -c программно на openssl (libcrypto, C/C++)

 , , , ,


0

1

Доброго времени суток. Нужно зашифровать sqlite3 базу и расшифровывать ее перед использованием. Хочется получить результат, похожий на тот, что дает консольный инструмент gpg при симметричном шифровании. Для шифрования я выбрал aes_256_gcm, для генерации ключа из парольной фразы - PKCS5_PBKDF2_HMAC.

  1. Где хранить вектор инициализации?
  2. Где хранить соль?
  3. Правильно ли использовать RAND_bytes для генерации соли? (Я понимаю, что генерируются байты, а не символы ASCII)
  4. Какая длинна соли и сколько итераций являются оптимальными?
  5. gpg неплохо сжимает данные после шифрования. Как добится такого же эффекта? Нужно использовать отдельную библиотеку для сжатия?
  6. Как определить, что пользователь ввел неверный пароль для расшифровки?

Ответ на: комментарий от Deleted

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

Rot1
() автор топика

gpg неплохо сжимает данные после шифрования

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

// И да, если нет понимания, как правильно хранить и генерировать IV и соль, то don't roll your own crypto¸потому что всё равно накосячишь, а используй готовые решения типа того же sqlcipher.

sjinks ★★★
()

Как определить, что пользователь ввел неверный пароль для расшифровки?

Ну например, прочитай первые 16 байт расшифрованного результата. Для БД sqlite должно быть что-то вида «SQLite format 3\0».

https://www.sqlite.org/fileformat.html

sjinks ★★★
()

Где хранить вектор инициализации?

Где-нибудь рядом с зашифрованными данными.

Где хранить соль?

Там же.

Правильно ли использовать RAND_bytes для генерации соли? (Я понимаю, что генерируются байты, а не символы ASCII)

Правильно.

Какая длинна соли

Не менее 64 битов.

и сколько итераций являются оптимальными?

Чем больше, тем сложней перебирать злоумышленнику. С другой стороны чем больше, тем дольше будет преобразовываться пароль и у тебя. Сам решай. Если это консольная программа, секундная задержка, наверное, не страшна. Если это нагруженный сервер с тысячей запросов в секунду, тут уже секундная задержка просто положит всё на лопатки, например.

gpg неплохо сжимает данные после шифрования. Как добится такого же эффекта? Нужно использовать отдельную библиотеку для сжатия?

Для сжатия нужно использовать стандартные алгоритмы/программы перед шифрованием. Например gzip или 7z. Шифрование не имеет к сжатию никакого отношения.

Как определить, что пользователь ввел неверный пароль для расшифровки?

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

Legioner ★★★★★
()
Ответ на: комментарий от sjinks

если нет понимания

А иначе сюда не пишут.

Лучше бы посоветовал почитать что-нибудь на эту тему.

Rot1
() автор топика
Ответ на: комментарий от Legioner

Где-нибудь рядом

Бд должна переноситься между компьютерами. Добавление этой информации в конец зашифрованного файла практикуется? Это не костыль?

Например gzip или 7z

Посоветуешь библиотеку? Zlib не слишком низкоуровневая для такой цели?

Rot1
() автор топика
Ответ на: комментарий от Rot1

Бд должна переноситься между компьютерами. Добавление этой информации в конец зашифрованного файла практикуется? Это не костыль?

Почему костыль? Смысл соли и случайного инициализационного вектора - усложнить подбор пароля. Сами по себе эти данные не являются секретными.

Посоветуешь библиотеку? Zlib не слишком низкоуровневая для такой цели?

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

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.