Monthly Archives: January 2011

Autenticação e Criptografia de Senhas

É comum que sistemas de informações utilizem um mecanismo de autenticação para acesso às ferramentas restritas através de um login e senha. Por questões de confidencialidade e segurança, é comum, também, que as senhas fiquem guardadas de forma criptografada no banco de dados. Os algoritmos de criptografia usados para estes casos são aqueles de via única (unidirecional), ou seja, que não permitem que um valor codificado seja descriptografado facilmente. O nome dado a um valor criptografado também é chamado de “hash”.

PHP oferece diferentes alternativas para criptografar uma senha. Cada uma delas pode ter suas peculiaridades na hora de se montar o mecanismo de autenticação. Vejamos algumas das principais funções usadas para criptografia de senhas:

  • md5 – Gera uma sequência binária de 16 bytes (ou 32 símbolos hexadecimais)
  • sha1 – Gera uma sequência binária de 20 bytes (ou 40 símbolos hexadecimais)
  • crypt – Gera um hash de acordo com um algum algoritmo escolhido (poucas opções)
  • hash – Módulo que oferece diferentes algoritmos de criptografia (para saber os disponíveis, basta usar hash_algos)
  • mcrypt – Módulo que oferece diferentes algoritmos de codificação/decodificação (para saber os disponíveis, basta usar mcrypt_list_algorithms)
  • mhash – Módulo obsoleto por hash.

MD5

Esta função é nativa do PHP e gera uma sequência binária de 16 bytes ou 32 símbolos hexadecimais. O uso é simples, basta passar o texto a ser codificado e se deseja obter o retorno na forma binária. Por padrão é retornado uma sequência hexadecimal, que é mais conveniente de se guardar em um banco de dados.

Para testar se uma senha digitada é igual à senha criptografada no BD, basta criptografar a senha informada e comparar as duas criptografadas. Afinal, uma sequência sempre gera o mesmo resultado criptografado.

Observação: Como o hash gerado por MD5 tem tamanho fixo, é óbvio que existem infinitas sequências textuais que produzem o mesmo hash. Porém, isso não é tão crítico, pois encontrar duas sequências que geram o mesmo hash é algo bastante incomum, especialmente entre senhas que envolvem apenas caracteres imprimíveis.


SHA1

Esta função é semelhante à MD5 (mesmos parâmetros), porém, o algoritmo gera uma sequência binária de 20 bytes ou 40 símbolos hexadecimais. Por padrão é retornado uma sequência hexadecimal.

Para testar se uma senha digitada é igual à senha criptografada no BD, basta seguir a mesma ideia apresentada em MD5.


Crypt

A função crypt também é nativa do PHP, mas, diferente de md5 e sha1, é genérica, pois pode-se especificar qual algoritmo a ser usado. A função recebe uma string a ser codificada e, opcionalmente, um sal. O “sal” é uma sequência aleatória usada como base para codificar outra sequência. A ideia é que utilizando o mesmo sal para codificar o mesmo texto, obtenha-se o mesmo valor. Mas usando um sal diferente para codificar o mesmo texto, pode-se obter resultados diferentes.

A função crypt varia o seu funcionamento de acordo com o sal informado:

  • CRYPT_STD_DES – Sal de 2 caracteres alfa-numéricos;
  • CRYPT_EXT_DES – Sal de 9 caracteres, sendo: 1 underscore + 4 bytes (indicando o número de iterações) + 4 bytes alfa-numéricos (sal propriamente dito)
  • CRYPT_MD5 – Sal de 12 caracteres, sendo: iniciado em “$1$” + 8 bytes (sal) + final “$”
  • CRYPT_BLOWFISH – Sal iniciado em “$2a$” + 2 dígitos (custo) + símbolo “$” + 21 bytes alfa-numéricos ou “.” ou “/” (sal) + final “$”
  • CRYPT_SHA256 – Sal de 16 caracteres, sendo: iniciado em “$5$” + 12 bytes (sal) + final “$”
  • CRYPT_SHA512 – Sal de 20 caracteres, sendo: iniciado em “$6$” + 16 bytes (sal) + final “$”

Exemplo de uso:

Observe que o valor codificado também tem como prefixo o próprio sal. Caso este valor codificado é usado como sal da função novamente, ela recupera apenas o sal, ignorando o valor codificado:

Portanto, para checar se uma senha codificada no BD é (provavelmente) a mesma que uma informada pelo usuário, basta fazer:

Observação: em algumas versões antigas do PHP, esta função dependia dos recursos do sistema operacional. A partir da versão 5.3.0, o próprio PHP possui sua própria implementação destes recursos e não depende do sistema.


Hash

O módulo hash era um módulo pecl, mas passou a fazer parte do PHP na versão 5.1.2. Ele também é genérico, pois pode-se informar qual o algoritmo de codificação a ser usado. Para saber os algoritmos suportados, basta usar a função hash_algos, que devolve um vetor com os nomes dos algoritmos. Para usar a função hash, basta passar no primeiro parâmetro o nome do algoritmo a ser usado, no segundo o valor a ser codificado, e no terceiro o tipo de saída (binário ou hexadecimal).

Exemplo:

A vantagem deste módulo em relação aos demais é que o algoritmo é informado por parâmetro, logo, pode ser informado dinamicamente, com o valor armazenado em algum lugar.

Além de hash, existem outras funções no módulo, como a função hash_hmac, que recebe também uma chave de codificação (como um sal), e utiliza o algoritmo HMAC.

Exemplo:

Note que, diferente de crypt, a função hash_hmac não embute a chave (sal) no valor codificado, logo, ele não pode ser usado como parâmetro.


Mcrypt

O módulo mcrypt suporta vários mecanismos de codificação/decodificação. As principais funções são a mcrypt_generic e a mdcrypt_generic, que recebem um resource com o mecanismo de codificação/decodificação e o valor a ser codificado/decodificado. O resource é criado pela função mcrypt_module_open e manipulado por outras funções.

Um exemplo de uso pode ser visto no link: http://br2.php.net/manual/en/function.mcrypt-module-open.php


Mhash

Este módulo está obsoleto pelo módulo hash. No PHP 5.3.0, as funções deste módulo são emuladas pelas funções do módulo hash. É melhor usar o módulo hash diretamente.

A principal função do módulo é mhash, que recebe o algoritmo, o valor a ser codificado e a chave HMAC (caso deseja-se utilizar o algoritmo HMAC). O valor retornado é hexadecimal.

Exemplo:

Programador para projeto em fevereiro

O CDI é uma ONG com 15 anos que já impactou mais de 1,3 milhão de pessoas e hoje está em 13 países.

Temos uma rede social NING, mas o crescimento e as necessiadades específicas de nossos projetos nos obriga a iniciar nova rede social usando uma ferramenta opensource para que possamos ter a flexibilidade necessária para cada projeto.

Visando essa nova postura estratégica, o CDI procura programador pleno para a implementação e customização da nova rede social.

Requisitos:

  • PHP / PLENO
  • MySQL / PLENO
  • HTML / PLENO
  • CSS / PLENO
  • AJAX / MÉDIO
  • REST / BÁSICO
  • JSON / BASICO

Metodologia Scrum de gestão com video conferencias diárias através de SKYPE

Temos 2 vagas para o projeto com tempo estimado de conclusão de 25 dias.

Interessados enviar curriculo e portifólio para rpires@cdilan.com.br

Obrigado.

Rafael Pires

Analista de Projetos

CDI LAN

Curso gratuito: Introdução ao PHP

Muitas vezes me pedem para indicar material para quem esta iniciando no PHP. Geralmente indico o livro PHP5: Programação Poderosa.

Porém a Season acaba de me dar um novo material para indicar pra quem me perguntar isso agora em janeiro. Eles estão oferecendo um minicurso gratuito introdutório ao PHP, se você conhece alguém ou esta iniciando no PHP está é uma ótima oportunidade, veja mais informações.

Introdução ao PHP – Primeiro contato com a tecnologia
Tipo: Minicurso Gratuito
Início: 19.01.2011
Duração: 3 horas / 1 aulas
Período: Qua – Noite
Horário: das 19hs às 22hs
Local:
Sala 22
Av. Bernardino de Campos, 327 – Paraíso
São Paulo/SP

Para se cadastrar e ter mais informações visite o site da Seasons: Introdução ao PHP

Cursos Zend abertos em São Paulo

A Season, parceira oficial da Zend no Brasil está anunciando, conforme prometido durante a PHP Conference, que realizará cursos oficiais da Zend em São Paulo. O curso anunciado é o PHP I: Fundamentos que será realizado no final de Fevereiro no Paraíso.

PHP I – Fundamentos (Treinamento Oficial Zend)
Tipo: Curso
Início: 28.02.2011
Fim: 02.03.2011
Duração: 24 horas / 6 aulas
Período: Seg. à Sex. – Integral
Local:
Av. Bernardino de Campos, 327 – Paraíso
São Paulo/SP
Se quiser sabe mais sobre o curso, visite a página da Season: PHP I: Fundamentos (mais informações)

Programador(a) PHP Junior/Pleno

A Pagamento Digital, emrpesa que pertence ao Grupo Buscapé, busca profissionais formados em curso superior na área de desenvolvimento de software com o seguinte perfil:

  • Programação Orientada a Objetos (PHP5+)
  • Banco de dados MySQL
  • Frameworks PHP (Identificar no CV os principais frameworks e nível de experiência: Zend, CakePHP, CodeIgniter, etc.)
  • HTML/XHTML, CSS, JavaScript, Ajax, e Frameworks JS (Jquery, Prototype, etc.)
  • Conhecimentos em ShellScript

Diferenciais:

  • Inglês fluente para leitura
  • Ferramentas de estatísticas (Google Analytics, Click Heat, Crazy Egg)
  • Técnicas de URLRewriting
  • Conhecimentos em SEO

Local de trabalho: Marília-SP

Horário: Segunda à Sexta-feira das 09:00 às 18:00 (40 horas semanais)

Salário compatível + pacote de benefícios completo

Envie seu currículo para: rh@pagamentodigital.com.br