Каково ваше мнение об адекватности openssl? Есть ли способ более проще с ней работать? И может быть вам встречались примеры? На мои вопросы как примеров использования гугл выдавал в основном маны.
Разве это не всемирно известная библиотека, которой пользуется безумное множество людей? И каждый пишет кучу функций вместо одной? Или я снова не прочитал документацию и все намного проще?
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, MikelSV, Вы писали:
MSV>Познакомился сегодня с openssl и в частности с RSA. Вот такое впечатление: http://mikelsv.livejournal.com/14057.html
MSV>Каково ваше мнение об адекватности openssl? Есть ли способ более проще с ней работать? И может быть вам встречались примеры? На мои вопросы как примеров использования гугл выдавал в основном маны.
MSV>Разве это не всемирно известная библиотека, которой пользуется безумное множество людей? И каждый пишет кучу функций вместо одной? Или я снова не прочитал документацию и все намного проще?
Я немного с OpenSSL работал ("экспериментировал") и мой вывод такой:
Эта библиотека, скорее, сложна (в силу отсутствия комментов) тому, кто слабо знает криптуху, чем тому, кто слабо знает С++.
Да она же, вроде как на чистом С, а не на плюсах написана. И интерфейс там процедурный тоже, если не ошибаюсь.
Здравствуйте, MikelSV, Вы писали:
MSV>Каково ваше мнение об адекватности openssl?
Вполне нормальная библиотека.
Может быть, где-то и корявая, но я видел и гораздо более кошмарные программные интерфейсы.
Такие, что только плеваться и можно.
MSV>Есть ли способ более проще с ней работать?
Написать свои обертки в стиле C++ и использовать во всех проектах с OpenSSL.
MSV>Разве это не всемирно известная библиотека, которой пользуется безумное множество людей? И каждый пишет кучу функций вместо одной? Или я снова не прочитал документацию и все намного проще?
Ну не знаю.
Приходилось работать с OpenSSL, например, в задачах шифрования-дешифрования трафика на лету, с
генерацией сертификатов и т.п. Например, полный код генерации SSL-сертификата, с заполнением
всех свойств, комментариями и проверкой ошибок, занял где-то 200 строк.
Разумеется, после вдумчивого чтения документации.
Да, я тоже "скучаю" по простым open/close, но сильно сомневаюсь, что у C-шной библиотеки,
охватывающей такое разнообразие криптографических функций и протоколов, вообще возможен
простой и красивый интерфейс. Недостижимый идеал !
Здравствуйте, MikelSV, Вы писали: MSV>Каково ваше мнение об адекватности openssl?
Исторически сложившийся сложный и громоздкий продукт. С кучей опций и вариантов использования, неправильно применив которые, можно существенно понизить безопасность.
>Есть ли способ более проще с ней работать?
Нет. Самый нормальный способ: выбрать стратегию (типы шифров, алгоритмы, размеры ключей, параметры и тп), документировать ее, и сделать обертки над openssl.
А еще, есть NaCl, libsodium — высокоуровнеая и дуракоустойчивая либа для криптографии. Разбирась с ней, хорошо понимаешь современные основы криптографии.
+1 за libgcrypt.
Правда, у меня возникли некоторые сложности при конвертации сгенерированных ключей в массив двоичных данных — соответствующая функция в порте библиотеки на целевую платформе (Raspbian) не реализована. Пришлось колдовать с форматированным выводом в строку и последующим ее разбором.
Для open source библиотеки с такой историей — более чем.
MSV>Есть ли способ более проще с ней работать?
Нет. Это изделие не для слабых духом. И да, маны — тоже не лучший источник информации. Наиболее правильный путь — залезть с головой в код. Там все не так сложно, как выглядит снаружи.
MSV>Разве это не всемирно известная библиотека, которой пользуется безумное множество людей? И каждый пишет кучу функций вместо одной?
Да, всемирно известная. Да, многие пользуются. Но в основном базовым функционалом — не для crypto, а для собственно SSL. Если вам нужно только шифрование, есть и другие варианты.
MSV>Или я снова не прочитал документацию и все намного проще?
Скорее всего, вы не разобрались. Там у openssl внутри всех этих BIO — счетчики ссылок (reference counters). Особождается BIO по вызову BIO_free, когда счётчик падает до нуля. Если вы пишете на С++, все становится на порядок проще при использовании unique_ptr (shared_ptr для совсем старых компиляторов).
Пример (выдран из тестов, поэтому никакой нормальной работы с ошибками):
// BIO_new_mem_buf is not const aware, but it does not modify the buffer.
std::unique_ptr<BIO, int (*)(BIO*)> pkbio(
BIO_new_mem_buf(const_cast<char*>(_source.c_str()), -1), BIO_free);
// BIO_new_mem_buf is not const aware, but it does not modify the buffer.
std::unique_ptr<BIO, int (*)(BIO*)> certbio(
BIO_new_mem_buf(const_cast<char*>(_source.c_str()), -1), BIO_free);
// Private key
std::unique_ptr<EVP_PKEY, void (*) (EVP_PKEY*) > pk(
PEM_read_bio_PrivateKey(&*pkbio, NULL, NULL, NULL), EVP_PKEY_free);
if (!pk)
throw std::system_error(ERR_get_error(), ssl_category(), "failed to read private key");
std::unique_ptr<X509, void (*) (X509*)> cert(
PEM_read_bio_X509_AUX(&*certbio, NULL, NULL, NULL), X509_free);
if (!cert)
throw std::system_error(ERR_get_error(), ssl_category(), "failed to read certificate");
if (SSL_CTX_use_PrivateKey(context_, &*pk) != 1)
throw std::system_error(ERR_get_error(), ssl_category(), "failed to assign private key");
if (SSL_CTX_use_certificate(context_, &*cert) != 1)
throw std::system_error(ERR_get_error(), ssl_category(), "failed to assign certificate");
Именно ваш случай я тоже могу подробнее посмотреть, но лучше оставлю вам в качестве домашнего задания. Ибо ваш случай простой, а там в openssl есть и более реальные замуты