PHP openssl pkcs7 * нужны файлы, проблема безопасности


Я хочу использовать эти функции openssl_pkcs7_* для проверки, подписи, шифрования и дешифрования писем. Я понял, что эти функции принимают только имена файлов для "ключевого файла", сертификата или самой "почты".

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

Теперь я просто хочу, чтобы вы, ребята, спросили, есть ли у кого-нибудь из вас идея, как я мог бы "подделать" файл в linux. например, используя какое-нибудь /dev/устройство, такое как /dev/stdin или что-то в этом роде. Есть идеи? Было бы здорово.

Эти "файлы" должны быть доступны для чтения и записи "www-данными".

Надеюсь, у вас, ребята, есть для меня несколько потрясающих идей.

С наилучшими пожеланиями, Макс

ИЗМЕНИТЬ: "tmpfile" - это физически расположенный файл, 100% гарантии удаления которого нет.

ПРАВКА2: Ну, я действительно думаю о создании сокета (AF_UNIX и файла сокета) и позволении openssl записывать в него, так как он выполняется из того же процесса. Но я не могу заставить это работать, есть какие-нибудь предложения?

Author: boesing, 2014-01-11

2 answers

Я хочу использовать эти функции openssl_pkcs7_* для проверки, подписи, шифрования и дешифрования писем.

Проблема, по-видимому, заключается в выборе функций PHP (или предложений PHP OpenSSL). Возможно, вам следует использовать что-то другое, например библиотеку, которая предоставляет то, что вам нужно.


Вот что действительно доступно в OpenSSL. Из pkcs7_encrypt(3):

PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, int flags);

Вы используете BIO для in-data, и это может быть память BIO. Там нет причина для записи файла на диск.

У вас есть аналогичный для pkcs7_decrypt(3):

int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags);

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

Для справки см. pem(3). Здесь почти слишком много функций, чтобы перечислять:

Пэм PEM_read_bio_PrivateKey, PEM_read_PrivateKey, PEM_write_bio_PrivateKey, pem_write_privatekey, pem_write_privatekey, pem_write_приватекей, PEM_write_bio_PKCS8ПриватеКей, pem_write_pkcs8приватекей, PEM_write_bio_PKCS8PrivateKey_nid, pem_write_pkcs8privatekey_nid, pem_write_pkcs8privatekey_nid - имя пользователя, Ключ PEM_read_bio_PUBKEY, ключ pem_read_pubkey, ключ PEM_write_bio_PUBKEY, Ключ PEM_write_PUBKEY, ключ PEM_read_bio_RSAPrivateKey, ключ pem_read_rsaprivatekey, PEM_write_bio_RSAPrivateKey, PEM_write_RSAPrivateKey, PEM_read_bio_RSAPublicKey, pem_read_rsapublickey, pem_read_rsapублики, PEM_write_bio_RSAPublicKey, PEM_write_RSAPublicKey, pem_write_rsapублики, Ключ PEM_read_bio_RSA_PUBKEY, Ключ PEM_read_RSA_PUBKEY, Ключ PEM_write_bio_RSA_PUBKEY, ключ pem_write_rsa_pubkey, PEM_read_bio_DSAPrivateKey, PEM_read_DSAPrivateKey, PEM_write_bio_DSAPrivateKey, PEM_write_DSAPrivateKey, Ключ PEM_read_bio_DSA_PUBKEY, ключ pem_read_dsa_pubkey, Ключ PEM_write_bio_DSA_PUBKEY, ключ pem_write_dsa_pubkey, PEM_read_bio_DSAparams, PEM_read_DSAparams, PEM_write_bio_DSAparams, Параметры pem_write_dsaparams, параметры PEM_read_bio_DHparams, параметры pem_read_dhparams, Параметры PEM_write_bio_DHparams, параметры pem_write_dhparams, параметры pem_read_bio_x509, PEM_read_X509 PEM_read_X509, PEM_write_bio_X509, pem_write_x509, pem_write_x509, PEM_read_bio_X509_AUX, PEM_read_X509_AUX, PEM_write_bio_X509_AUX, PEM_write_X509_AUX, PEM_read_bio_X509_REQ, PEM_read_X509_REQ, PEM_write_bio_X509_REQ, pem_write_x509_req, pem_write_x509_req, PEM_write_bio_X509_REQ_NEW, pem_write_x509_req_new, pem_write_x509_req_new, pem_read_bio_x509_crl, pem_read_x509_crl, PEM_write_bio_X509_CRL, PEM_write_x509_CRl, PEM_read_bio_PKCS7, pem_read_pkcs7 PEM_write_x509_CRl, PEM_read_bio_PKCS7, PEM_write_bio_PKCS7, pem_write_pkcs7, pem_write_pkcs7, Последовательность PEM_read_bio_NETSCAPE_CERT_SEQUENCE, Последовательность PEM_read_NETSCAPE_CERT_SEQUENCE, PEM_write_bio_NETSCAPE_CERT_SEQUENCE, pem_write_netscape_cert_sequence

PEM_write_bio_NETSCAPE_CERT_SEQUENCE

Если вы найдете что-то, что предлагает больше возможностей OpenSSL, вы также можете изучить функции CMS_*. С ними тоже легко работать.

Вы можете увидеть примеры того, как их использовать в <openssl dir>/demos/cms_enc.c, <openssl dir>/demos/cms_dec.c, <openssl dir>/demos/cms_sign.c и <openssl dir>/demos/cms_verify.c.

Две из интересующих функций:

CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, unsigned int flags);

И

int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, BIO *dcont, BIO *out, unsigned int flags);
 0
Author: jww, 2014-01-12 02:02:05

Это не очень элегантно, но вы могли бы использовать ob_start и потоковые обертки, чтобы обмануть openssl_pkcs7_decrypt, чтобы не выводить файл.

function pkcs7_decrypt_in_mem($infile, $cert, $key) {
    ob_start();
    $rtn = openssl_pkcs7_decrypt($infile, 'php://stdout', $cert, $key);
    $decrypted = ob_get_contents();
    ob_end_clean();

    if (!$rtn) { return FALSE; }
    return $decrypted;
}

Единственный файл , который должен существовать, - это $infile. Оба $cert и $key передаются по значению, а не по имени файла.

 3
Author: Mr. Llama, 2014-09-07 00:42:31