PHP openssl pkcs7 * нужны файлы, проблема безопасности
Я хочу использовать эти функции openssl_pkcs7_* для проверки, подписи, шифрования и дешифрования писем. Я понял, что эти функции принимают только имена файлов для "ключевого файла", сертификата или самой "почты".
Imho это большая проблема с безопасностью, так как могут возникнуть проблемы, из-за которых временные файлы, созданные для этих файлов, не удаляются. В этом случае системные операторы, например, могли бы прочитать зашифрованное сообщение, потому что оно временно находится где-то в файловой системе.
Теперь я просто хочу, чтобы вы, ребята, спросили, есть ли у кого-нибудь из вас идея, как я мог бы "подделать" файл в linux. например, используя какое-нибудь /dev/устройство, такое как /dev/stdin или что-то в этом роде. Есть идеи? Было бы здорово.
Эти "файлы" должны быть доступны для чтения и записи "www-данными".
Надеюсь, у вас, ребята, есть для меня несколько потрясающих идей.
С наилучшими пожеланиями, Макс
ИЗМЕНИТЬ: "tmpfile" - это физически расположенный файл, 100% гарантии удаления которого нет.
ПРАВКА2: Ну, я действительно думаю о создании сокета (AF_UNIX и файла сокета) и позволении openssl записывать в него, так как он выполняется из того же процесса. Но я не могу заставить это работать, есть какие-нибудь предложения?
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);
Это не очень элегантно, но вы могли бы использовать 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
передаются по значению, а не по имени файла.