Pergunta

Eu quero usar estes openssl_pkcs7_* funções para verificar, assinar, criptografar e descriptografar e-mails.Percebi que essas funções só aceita nomes de arquivos para a "keyfile", o certificado ou o "correio" em si.

Imho, isso é um grande problema de segurança, pois pode haver problemas que arquivos temporários criados para estes arquivos não sejam eliminados.Nesse caso, os operadores do sistema, e.g.pode ler a mensagem encriptada, porque a sua em algum lugar no sistema de arquivos temporariamente.

Agora, eu só quero que vocês para perguntar se algum de vocês tem uma idéia de como eu poderia "falso" um arquivo no linux.exemplo:usando alguns /dev/ dispositivo /dev/stdin ou algo assim.Alguma idéia?Seria incrível.

Estes "arquivos" deve ser leitura e escrita por "www-data".

Espero que vocês tenham algumas ideias surpreendentes para mim.

Com os melhores cumprimentos, Max.

EDITAR:"tmpfile" é fisicamente um arquivo localizado, não há 100% de garantia de eliminação tho.

EDIT2:Bem, eu estou realmente pensando sobre a criação de um socket (AF_UNIX e um socket-File) e deixe openssl escrever pois a sua executado a partir do mesmo processo.Mas eu não chegar a este trabalho, alguma sugestão?

Foi útil?

Solução

Eu quero usar estes openssl_pkcs7_* funções para verificar, assinar, criptografar e descriptografar e-mails.

O problema parece ser a escolha do PHP funções (ou PHP OpenSSL ofertas).Talvez você deve usar algo mais, como uma biblioteca que fornece o que você precisa.


Aqui está o que realmente está disponível a partir do OpenSSL.A partir de PKCS7_encrypt(3):

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

Você usa um BIO para o in-data, e que pode ser uma memória BIO.Não há nenhuma razão para escrever um arquivo de disco.

Você tem similar para PKCS7_decrypt(3):

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

Agora, para as chaves.As chaves podem ser de leitura (e escrita), usando BIOs também.Isso significa que eles podem usar uma memória bio.Mas eu não tenho certeza o quão útil que seria desde as chaves precisam ser armazenados em algum lugar.

Para referência, ver pem(3).Há muitas funções para a lista:

PEM, PEM_read_bio_PrivateKey, PEM_read_PrivateKey, PEM_write_bio_PrivateKey, PEM_write_PrivateKey, PEM_write_bio_PKCS8PrivateKey, PEM_write_PKCS8PrivateKey, PEM_write_bio_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_write_bio_RSAPublicKey, PEM_write_RSAPublicKey, 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_write_bio_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_bio_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_bio_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


Se você encontrar algo que ofereça mais do OpenSSL, você pode olhar para o CMS_* funções, também.Eles são fáceis de trabalhar, também.

Você pode ver exemplos de como utilizá-los em <openssl dir>/demos/cms_enc.c, <openssl dir>/demos/cms_dec.c, <openssl dir>/demos/cms_sign.c e <openssl dir>/demos/cms_verify.c.

Duas das funções de interesse são:

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

e

int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, BIO *dcont, BIO *out, unsigned int flags);

Outras dicas

Não é muito elegante, mas você pode usar ob_start e o fluxo de wrappers para enganar openssl_pkcs7_decrypt a não saída de um arquivo.

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;
}

A única arquivo necessário para existir é $infile.Ambos $cert e $key como passados por valor, não por nome de arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top