PHP Classes

File: leiame_SecuritySession.txt

Recommend this page to a friend!
  Classes of Marcelo Costa   ooeLite   leiame_SecuritySession.txt   Download  
File: leiame_SecuritySession.txt
Role: Documentation
Content type: text/plain
Description: security session doc
Class: ooeLite
Web application development framework
Author: By
Last change:
Date: 15 years ago
Size: 10,035 bytes
 

Contents

Class file image Download
A classe SecuritySession e o desenvolvimento da classe mafiasession que foi criada a partir do desafio de fazer uma forma segura de efetuar um login em um sistema crítico em segurança. O uso de SSL seria uma opção obvia e bastante válida, mas mesmo sem o uso de SSL a classe mafiasession provem uma forma confiavel e de alto grau de segurança, superior ao simples uso do SSL. A segurança é provida por um conjunto de soluções confiaveis na troca de informações entre cliente servidor. Metodos de autenticações possuem seus pontos fracos , alguem pode interceptar os dados enviados por formulário com uma ferramenta tipo "snif" como o tcpdump presente em diversos sistemas operacionais ou com o uso de programas como por exemplo Wireshark . Em um formulário comum tanto o login quanto a senha são enviados ao servidor sem nenhum tipo de criptografia, a aplicação então executa a ação requisitada e verifica a autenticidade do par senha/login. Muitos desenvolvedores adotaram a solução de criptografar a senha no banco de dados, desta forma a aplicação aplica a criptografia a senha enviada pelo formulário e a compara com a senha criptografada no banco de dados, essa implementação por sua vez é relativamente fraca pois bastaria saber qual o tipo de criptografia aplicada, normalmente MD5, mas contunia permitindo a visualização da senha que sai do banco de dados, permite o uso do própio formulário de login ou mesmo um clone do mesmo. Outra implementação de segurança seria criptografar a senha na saida do formulario, com javascript, mas mesmo essa solução ainda é relativamente fraca já que torna possivel a quebra "offline" da senha, ou seja capturar a senha criptografada e atravez de um programa baseado em dicionário de palavras ou na simples tentativa e erro encontrar uma "colisão" entre uma palavra e a senha digitada, mas a quebra de segurança desse método pode ser mais facil ainda caso a senha a ser comparada seja a mesma só que criptografada , nem seria necessário quebrar a senha bastaria envia-la criptografada comforme foi capturada. Diversas solução podem ser usadas mas o que elas tem em comum é não serem o suficiente fortes ou permitir que seja descoberto um método de faze-lo , alguns aplicam a criptografia seguida vezes a mesma string, o que pode ser descoberto por tentativa e erro. vou explicar como funciona a classe SecuritySession: Primeiro vamos entender o que vem a ser criptografia: Criptografia é uma forma codificada de se trocar mensagem, voce envia uma mensagem com os caracteres trocados mas quem recebe sabe qual foi a forma que voce fez isso e decodifica sua mensagem. Podemos dividir os modelos de criptografia em dois tipos, encode e hash. O método Encode é como se voce simplesmente embaralhasse os caracteres seguindo uma forma matemática ao qual quem recebe sabe como fazer a conta para desfazer o que foi feito e ler a sua mensagem exatamente como foi escrita, ou seja para toda forma de encode tem um decode. O método Hash já funciona de forma diferente , ela não simplesmente executa operações matematica, ele tambem retira alguns valores , troca de posição no meio da conta, faz uma grande bagunça com os caracteres, para isso ele usa algoritimos muitos grandes , numeros gigantescos , mas seus resultados tem que ser comprimidos, por causa disso ele apresenta somente uma certa quantidade de caracteres, por exemplo não importa o que voce criptografa em MD5 o resultado sera sempre 32 caracteres, assim fica "impossivel" fazer a conta ao contrário , aplicar um decode, mas mesmo esse método possue limitações, ou seja pode existir o que é denominado de colisão, ou seja dois conjuntos de caracteres podem ter o mesmo resultado, mesmo MD5. A solução foi criar algoritimos mais poderosos ainda que o MD5 como por exemplo o SHA1,SHA256,ripemd160 entre outros. Apenas como informação complementar string com até 4 caracteres são facilmente encotradas colisões em MD5 , recomenda-se um minimo de 6 caracteres, para SHA1 foi noticiado apenas duas vezes na casa de 2 elevado 63 e a 69 e espera-se que seja suportado 2 elevado a 80 a probabilidade de se encontrar uma colisão. compreendido os métodos básicos de criptografia vamos a uma pequena consideração: encontrar uma colisão em MD5 é possivel mas não é facil , encontrar uma colisão em SHA1 é ainda quase impossivel mas encontrar uma colisão que atenda tanto a MD5 ou a SHA1 é por hora algo considerado impossivel. Todos os meios de criptografia tem sua limitações , assim como toda aplicação cliente servidor pois existem formas conhecidas de interceptar as informações, tendo ciencia disso foi desenvolvido um método para permitir a troca de informações de forma criptografa por hash, sem volta portanto, atravez de uma chave criptografica qualquer. Ou seja não basta aplicar a criptografia tem que saber qual é a chave que esta misturada e ela, esta chave não é totalmente secreta muitas vezes , alguma são chaves publicas mesmo, esse método foi denominado HMAC. Como funciona o HMAC: O HMAC se baseia no uso de um método hash para ocultar uma mensagem, ou seja é usado um hash misturado a uma "chave" HMAC para um serivor , este servidor tem tanto as informações quanto a "chave" HMAC , o servidor então executa o HMAC com a chave que ele possue nas prováveis mensagens enviadas e por igualdade de resultado determina qual a mensagem foi enviada. A segurança desse formato se baseia tanto o quanto é seguro o HASH assim como a "chave" do HMAC de verificação de autenticidade de origem , ou seja a chave HMAC é uma forma de verificar a autenticidade da origem da mensagem criptografada. O quanto é seguro o HMAC: O HMAC é a principio tão seguro o quanto é o seu método hash caso sua chave seja publica , muito mais seguro se sua chave não for "totalmente" publica e extremamente seguro se voce fazer uma rotina, com quem troca a mensagem, para trocar periodicamente a chave. Foi então estabelecido um critério para troca de informações atravez de uma chave publica para poder adquirir uma chave privada, esse critério é hoje largamente utilizado , é o mesmo principio da criptografia SSL para troca de chaves. E a classe mafiasession o que ela faz: Exatamente isso , ela estabelece uma chave publica para cada uma requisição, após a autenticação desta chave é verificada as informações de login e senha e fornecida uma chave privada e mesmo depois de obter a chave privada a mesma é trocada a cada periodo de tempo para tornar a aplicação o maximo em qualidade e segurança. Os passos funcionais da classe SecuritySession: Para se iniciar o processo de login se faz necessário acessar o formulário, este formulario traz em um campo hidden uma chave que foi estabelecida para aquela requisição e valida por um tempo pre-determinado , default de 30 segundos. Ao digitar a senha e o login as "strings" são criptografadas tanto em MD5 como em SHA1, submetidas ao processo HMAC de cada uma com a respectiva chave de autenticação temporária , um HMAC para MD5 e outro para SHA1 e enviada ao servidor que primeiro verifica a autenticidade da chave publica temporária e depois verifica por processo de HMAC com a mesma chave publica temporária a autenticação do usuario, tento sucesso nos dois processos é então criado então uma chave privada no servidor, guardadas em sessão no servidor tanto as chaves que foram usadas para autenticar o formulário como a que permitiu a autenticação do usuario, e a cada 60 segundos é verificado novamente a chave privada e gerada uma nova chave privada que sobreescreve a chave privada guardada na sessão do servidor. Caracteristicas principais de segurança da classe SecuritySession: possuir uma chave de autenticidade de requisição de autenticação em sha256. possuir essa chave de autenticação um tempo util para ser usada. possuir uma chave privada armazenada em sessão no servidor em sha256. trocar a cada intervalo de tempo a chave privada armazenada no servidor. tornar o servidor assim como o banco de dados totalmente ignorantes quanto qual a senha do usuario, já que no banco é armazenado os hash MD5 e SHA1 a ser aplicado o HMAC para comparar com o resultado dos dados HMAC recebidos do formulário de login. Um exemplo funcional esta publicado junto com a classe. A classe SecuritySession esta publicada sob licensa BSD, o que implica que voce pode usar e alterar sem qualquer restrição ao não ser de manter o texto de direitos autorais do autor. para contribuir com idéias e soluções que tornem essa classe mais restritiva e ter maior grau de confiabilidade em segurança contacte o autor. A classe SecuritySession apesar de ser extremente segura ela não tem um mecanismo para evitar o uso de senhas inseguras como com menos de 4 caracteres , senhas com palavras simples, 123456 por exemplo, ou impedir que a seja digitada seja capturada por keylog , para isso seria necessário um teclado virtual. O autor espera ter contribuido no aumento da segurança dos processos de autenticação de usuários junto a comunidade de desenvolvedores de aplicações que exigem login. O uso da classe SecuritySession não diminue e sim contribui para o seu uso conjunto com processo de troca de dados via SSL. Dependencias: A classe SecuritySession precisa do php cm suporte a PECL Hash http://br.php.net/manual/en/ref.hash.php http://pecl.php.net/package/hash http://www.freebsd.org/cgi/url.cgi?ports/security/pecl-hash/pkg-descr Referencias: http://pajhome.org.uk/crypt/md5/auth.html http://www.ietf.org/rfc/rfc2104.txt http://en.wikipedia.org/wiki/SHA-1 Classe MafiaSession: http://www.phpclasses.org/browse/package/3705.html * @author Marcelo Soares da Costa * @email phpmafia at yahoo dot com dot br * @copyright Marcelo Soares da Costa © 2008. * @license FreeBSD http://www.freebsd.org/copyright/freebsd-license.html