Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

Criptografia segura no PHP

Recommended Posts

Se você éum desenvolvedor web profissional, segurança é um aspecto importante do seutrabalho. Se você estiver planejando armazenar dados críticos ou sensíveis emsua aplicação web, como senhas, cartões de credito etc, você deveria usar uma criptografia segura (strongcryptography) para proteger esses dados.

 

 

O que é criptografia segura?

Criptografia seguraé o uso de sistemas ou componentes que são considerados altamenteresistentes à criptoanálise, o estudo de métodos para decifrar códigos.

 

Teoricamente falando, se criptografarmos earmazenarmos dados confidenciais em um banco de dados, arquivo, ou qualquer outracoisa, um atacante malicioso não será capaz de descriptografá-los sem saber achave, uma sequência de números usada para criptografar ou para descriptografardados. Como podemos provar que o atacante não será capaz de descriptografar osdados?

 

Infelizmente, a resposta correta é que nãopodemos ter certeza. Podemos apenas ter um bom nível de segurança usandoalgoritmos bem testados de criptografia (criptografia segura).

 

Porexemplo, a cifra ENIGMA, usada na Segunda guerra Mundialcomo um sistema para criptografar a comunicação entre soldados alemães, hojenão é considerada criptograficamente forte. O DES, um algoritmo padrão do FIST em 1976, que infelizmente ainda é utilizado em muitos sistemas, não éconsiderado criptograficamente forte mais. Em 1998, a Electronic FrontierFoundation (EFF) construiu uma máquina, o EFF DES cracker, para executar uma pesquisa por força bruta pela key space (o conjunto das possíveis senhas) da encriptação cipher ? ou seja, para descriptografar umamensagem criptografada tentando cada chave possível. O objetivo éprovar que a chave DES não é mais segura. Essa máquina era capaz de encontrar achave de uma mensagem criptografada em menos de um dia, e estamos falando de1998!

 

Atualmente, alguns dosalgoritmos que podem ser considerados criptograficamente fortes sao: Blowfish, Twofish, AdvancedEncryption Standard (AES, Rijndael), 3DES, Serpent, RSA etc. É importantedizer que a segurança de qualquer algoritmo é relacionada à força e ao tamanhoda chave, e iremos falar desse ponto a seguir.

 

 

Por quedevemos usar criptografia segura?

Muitosdesenvolvedores, quando têm a necessidade de criptografar alguma informação,tentam implementar suas cifras pessoas usando diferentes abordagens. Nainternet, você consegue encontrar várias implementações de cifras domésticas noPHP.

 

Eudesencorajo fortemente o uso dessas cifras, e vou dizer por quê. Criar uma cifrasegura é algo bastante complicado e, se você não for um expert, eu diria que éuma tarefa praticamente impossível. Além disso, estamos falando de criptografia segura,o que significa que mesmo se você for capaz de criar uma nova cifra, vocêprecisa de tempo para provar que ela é segura, compartilhando a implementaçãodo algoritmo na comunidade open source (se você estiver pensando que asegurança da sua cifra está relacionada com a política de não compartilhar seusdetalhes, por favor continue a ler este artigo).

 

 

Criptografia segura no PHP

O PHP oferecediferentes implementações dos algoritmos de criptografia mais importantes. Emparticular, o PHP tem as extensões de criptografia a seguir:

 

  • Hash
  • mcrypt
  • OpenSSL

Aextensão Hash não precisa de bibliotecas externas e é acionada porpadrão no PHP 5.1.2. Essa extensão substitui a antiga extensão mhash. Com essaextensão, você pode gerar hashes ou HMAC (Hash-based Message AuthenticationCode). Ela suporta os algoritmos de geração hash mais comuns usados nacriptografia segura. Se você quiser saber quais algoritmos são suportados peloseu ambiente PHP, pode utilizar a função hash_algos(), que te dá uma listade todos os algoritmos suportados. Para mais informações sobre essa extensão,veja o manual PHP aqui.

 

Aextensão mcrypt é uma interface para a biblioteca mcrypt, que suportauma grande variedade de blocos de algoritmos, como DES, 3DES, Blowfish(default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 e GOST nos métodos de encriptação CBC,OFB, CFB e ECB. Essa extensão é a mais utilizada para criptografardados usando cifras simétricas. Para mais informações sobre ela extensão, vejao manual PHP aqui.

 

Aextensão OpenSSL usa as funções do OpenSSLproject parageração e verificação de assinaturas e para lacrar (criptografar) e abrir(descriptografar) dados. Você pode utilizar o OpenSSL para proteger dadosusando a criptografia pública de chaves com o algoritmo RSA. Para maisinformações sobre essa extensão, veja o manual PHP aqui.

 

 

Melhores práticas no PHP

Até agora,discutimos os aspectos gerais da criptografia segura. Agora eu gostaria de tefalar quais são as melhores práticas em como usar a criptografia segura no PHP.Aqui você pode encontrar algumas das minhas recomendações:

 

  • Use algoritmospadrão

Sempre use um algoritmo padrão para criptografar seus dados. Não tenteimplementar sua cifra doméstica, você irá gastar muito tempo e energia semconseguir obter uma segurança real. Minha sugestão é usar os melhores algoritmosdisponíveis. Exemplos de algoritmos criptograficamente sólidos são:

 

- algoritmos de chave simétrica: AES, que é um padrão FIST 197desde 2001;

- algoritmos de chaves públicas: RSA, um algoritmo padrão da industria utilizado emmuitos produtos;

- Funções Hash: SHA-x, em que x pode ser 1,256,384, e512. SHA é um padrão NIST.

 

  • Espaçoda chave

Quando falamos em segurança de uma cifra, o espaço chave é um dos parâmetrosmais importantes. Se nenhum design sólido explícito é dado pela cifra, a forçado design é igual ao tamanho da chave. Por exemplo, a cifra DES usa uma chavede 56 bits, o que significa que o espaço da chave é de 2^56. Estes númerosparecem imensos, mas computadores modernos podem suportá-los, e o EFF prova isso com o cracker DES. Então o espaço da chave é muito importante. Para cifrassimétricas, eu diria que 128 bits é o tamanho mínimo para uma chave decriptografia forte. Com relação à criptografia de chaves públicas, os expertsrecomendam um tamanho mínimo de 2048 bits se quisermos protegernossos dados por 20 anos.

 

  • Princípio de Kerchoof

Auguste Kerckhoffs foi um linguista alemão e criptógrafo do Higher CommercialStudies em Paris no final do século 19. Ele escreveu, em um artigo famoso do ?leJournal des Sciences Militaires?, a seguinte frase, que é considerada o máximona criptografia moderna:

 

Um sistema de criptografia deve ser seguromesmo se tudo que disser respeito ao sistema, exceto a chave, seja deconhecimento público.

Usando ainterpretação da Shannon, ?O inimigoconhece o sistema?. Na minha opinião, no mundo do software, você somentetem segurança com o uso de algoritmos open source. Se o código-fonte foitestado por milhares de pessoas ao redor do mundo, a probabilidade de encontrarum bug de segurança e consequentemente de consertá-lo é mais alta usando umsoftware open source do que comparada à chance do uso de um software proprietário.

 

  • Não use rand() ou mt_rand()

Até para este ponto, não tente implementar seu gerador aleatório. Você não podeimplementar um gerador de números aleatório seguro usando a função rand() noPHP. Essa função usa a biblioteca libc para gerar números pesudoaleatóriosque não são seguros para aplicativos de criptografia. Ela gera númerosaleatórios usando um método aditivo linear de feedback, com um período curto,que é previsível. Até a função mt_rand() não é segura do ponto de vista dacriptografia. Ela uso o algoritmo Mersenne Twisterpara gerar números pseudoaleatórios. Essa função é melhor que a rand(), porque é mais rápida e produz númerospseudoaleatórios com um período maior, mas ainda é um algoritmo determinista,então também é previsível. Para gerar um número aleatório criptograficamenteforte no PHP, você tem que usar a função openssl_random_pseudo_bytes() dabiblioteca OpenSSL. Essa função estádisponível a partir do PHP 5.3. Se você estiver usando uma versão antiga do PHP, pode usar esta implementação:

 

function secure_rand($length) {

if(function_exists('openssl_random_pseudo_bytes')) {

$rnd = openssl_random_pseudo_bytes($length, $strong);

if($strong === TRUE)

return $rnd;

}

for ($i=0;$i<$length;$i++) {

$sha= sha1(mt_rand());

$char= mt_rand(0,30);

$rnd.= chr(hexdec($sha[$char].$sha[$char+1]));

}

return $rnd;

}Nessaimplementação, eu encriptei os outputs da mt_rand() para hash. Esse método aumenta asegurança do Mersenne Twister, mas não tem o mesmo nível de segurança daimplementação OpenSSL.

 

  • Useum valor salt em funções hash

Se você estiver usando uma função hash para proteger os dados, como por exemplouma senha, concatene os dados com um valor randômico (salt) antes de gerar ohash. Um salt randômico irá proteger seus dados de Dictionary attacks.

 

  • Tamanhoe força de senhas

Não dê a possibilidade para os usuários da sua aplicação web de escolherem senhasbobas e pequenas. Você deve sempre usar uma senha com no mínimo 8 caracteresmisturados com números e letras. Você pode usar a biblioteca CrackLib para testar a ?força? de uma senha.

 

  • Não use senhas com texto puro como chave para encriptar

Uma boa prática na criptografia, usando cifras simétricas, é usar um valorhashed como chave de uma cifra. Esse método aumenta a segurança dos dadoscriptografados ao adicionar maior aleatoriedade. Isso significa que se vocêquiser gerar uma boa chave para a cifra, você deve usar o hash da senha eusá-lo como a chave do seu algoritmo de criptografia.

 

  • UseBase64 para codificar dados criptografados

Se você precisar migrar dados criptografados entre sistemas diferentes, como transmitir dados pela internet, é recomendado codificar os dados em Base64.No PHP, você pode usar as funções base64_encode() e base64_decode(). Essacodificação irá garantir que seus dados sejam armazenados corretamente,independentemente do sistema de codificação utilizado no seu ambiente.

 

É claroque essas são apenas sugestões gerais, e os pontos relacionados ao uso corretoda criptografia são mais do isso. Se você estiver interessado emcriptografia aplicada, eu fortemente recomendo ler os livros de BruceSchneier: Applied Cryptography, Practical Cryptography, e Cryptography Engineering.

 

?

 

Texto original disponível em http://www.zimuel.it/blog/2011/01/strong-cryptography-in-php/

 

 

 

http://imasters.com.br/artigo/21473/php/criptografia-segura-no-php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom artigo, me esclareceu algumas dúvidas que tinha.

Parabéns.

 

Só fiquei com uma dúvida, tinha lido que Hash não seria uma forma de criptografia pois ela não pode ser revertida, estava incorreto então?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.