2010-01-14 1 views
2

Является ли openssl's BF_cfb64_encrypt() потоком безопасным?openssl BF_cfb64_encrypt thread-safety

Образец кода, чтобы использовать его для шифрования/дешифрования капли данных, будет высоко оценен.

ответ

1

Согласно FAQ, процедуры OpenSSL являются потокобезопасными. Я посмотрел на источник этой функции, и он действительно выглядит потокобезопасным. Конечно, предполагается, что вы не передаете одни и те же входные/выходные буферы функции на разные потоки.

Для примера обращения к нему вы можете посмотреть в источнике OpenSSL. Существует файл с именем bftest.c, расположенный в openssl/crypto/bf /, который имеет тестовые вызовы функции.

Редактировать Подумав об этом немного больше, возможно, все же разумно использовать функциональность CRYPTO_set_locking_callback для многопоточной блокировки. Алгоритм Blowfish, о котором спрашивается в исходном вопросе, в настоящее время (в версии OpenSSL, который я использую), не использует эти блокировки, но это не гарантирует, что в будущем по какой-то причине это не произойдет. Плюс это спасает будущую боль, если вы в конечном итоге используете функциональность (например, RAND_bytes), которая нуждается в этих блокировках.

+0

Thanks Mark Я был смущен URL http://www.openssl.org/docs/crypto/threads.html Любая идея, о чем идет речь. Также я был любопытным, чтобы узнать, что такое EVP? –

+1

Если ваш код использует несколько потоков с общими ресурсами, то OpenSSL будет использовать обратный вызов, определенный CRYPTO_set_locking_callback для получения/освобождения блокировок. Он очень прост в использовании (пример находится в файле crypto/threads/mttest.c. В основном он позволяет указать функцию обратного вызова, которая вызывает функцию блокировки, подходящую для платформы (например, WaitForSingleObject в win32). не считаю, что BF_cfb64_encrypt нуждается в этой функции.Я посмотрел на код и не вижу вызовов для блокировок. С другой стороны, это, вероятно, было бы хорошо, поскольку будущие версии могут получить блокировки. –

+1

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