Criptografia em PHP e WebServices
Olá pessoal. Tempo raro este, torna difícil postar novas matérias, mas vamos lá!
Como já vimos, os Web Services utilizam-se do protocolo SOAP para o transporte das mensagens, estas, em XML. Porém, o SOAP não se preocupa nem um pouco com a segurança das informações, muito menos se ela chegou no seu determinado destino. Como visto na matéria SOAP, é um protocolo simples, muito mais que outros protocolos distribuídos.
Segurança
Os principais desafios para a construção de uma arquitetura segura são:
01. Quanto à integridade e confidencialidade, garantindo que os dados transmitidos pelo protocolo SOAP não sejam alterados indevidamente e não possam ser acessados durante o seu transporte por entidades não autorizadas.
02. Quanto à autenticação e autorização, garantindo a identidade da fonte das informações e os acessos aos métodos realizados com a devida permissão dos responsáveis.
03. E, por fim, a análise do conteúdo, garantindo que o conteúdo das mensagens trocadas esteja adequado e que não causará danos ao receptor.
Devido ao uso do protocolo SOAP em sua comunicação, o qual utiliza-se de XML em suas mensagens, ou seja, um arquivo texto perfeitamente legível, onde devemos sem dúvida nenhuma nos precaver e investir na segurança da transmissão dos dados e na autenticação de quem usufrui dos mesmos.

Solução
A idéia desta matéria é construir uma camada simples de criptografia, utilizando-se do OpenSSL para a mesma. Vou criar uma classe e dar um exemplo, tanto para chaves simétricas tanto quanto para chaves assimétricas. Sabem a diferença? Bom, vamos ao começo então.
Criptografia
Segundo HENDRICKS, “A criptografia é a ciência que trata da preservação dos dados privados”. Nada mais é que um texto cifrado, criptografar é o ato de cifrar um determinado texto e decriptografar é fazer o inverso.
Hoje em dia, temos algoritmos capazes de controlar esses processos, através de chaves de criptografia. Existem duas classes desses algoritmos criptográficos baseados em chave:
. Simétricas (chave secreta): Utilizam-se da mesma chave para criptografia e decriptografia

São geralmente muito mais rápidos quando referidos a execução, se comparados aos algoritmos assimétricos, devido às chaves públicas assimétricas serem muito mais extensas.
. Assimétrica (chave pública): utiliza-se de chaves diferentes para a criptografia e para a decriptografia.

As chaves de criptografia assimétricas se tornam um grande aliado quando falamos em segurança dos Web Services. Esta forma de criptografia utiliza uma chave pública relacionada matematicamente à chave privada. Com isso, apenas o dono do par de chaves conhece a chave privada, enquanto a chave pública pode ser livremente distribuída.
Caso queiram saber mais sobre as chaves, favor comentar abaixo da matéria que posso futuramente montar um artigo apenas sobre como são geradas as chaves e toda a questão matemática envolvida e o porquê as chaves assimétricas são tão seguras.
Vamos à Prática
Pessoal, precisamos da extensions OPENSSL no PHP rodando mod_openssl e o OpenSSL instalado.
Para o WINDOWS, recomendo que leiam a matéria Instalando SSL no Apache2 em ambiente Windows do meu colega Leonardo Calado, aqui do iMasters mesmo, muito boa por sinal.
Ensina também a gerar certificados, porém não é necessário para o nosso caso neste primeiro momento, apenas a instalação do OPENSSL em sua máquina.
Criptografia no PHP
Chave Simétrica (clique na imagem para abrir o código em tamanho maior)
Código

Resultado

Chaves Assimétricas
As chaves assimétricas seguem mais ou menos o mesmo padrão, porém a criptografia é feita através da chave pública, que pode ser enviada pela rede e decriptografada com a chave privada.
Devido ao tamanho dos fontes, estarão apenas disponíveis para download abaixo da matéria, abaixo apenas o resultado.
Resultado

Criptografia em WebServices via PHP
Vamos utilizar os mesmos fontes de um outro artigo: Utilizando Web Services em PHP.
Criamos o cliente.php

Linha 11: Passamos a chave simétrica.
Linha 13: Criamos uma função para simplificar o processo de decriptografia.
Linha 31: Acionamos a decriptografia em cima do $result.
Linha 13: Criamos uma função para simplificar o processo de decriptografia.
Linha 31: Acionamos a decriptografia em cima do $result.
No server.php:

Linha 19: Incluimos a classe de criptografia simétrica.
Linha 20: Instanciamos ela.
Linha 23: Passamos a chave simétrica (poderiamos gerar uma nova, mas ela precisa ser identica a chave do cliente).
Linha 25: Seta a chave na classe.
Linha 26: Seta o texto a ser criptografado.
Linha 27: Criptogra o texto.
Linha 28: Pega o texto de forma hexadecimal (É necessário para que os dados circulem no protocolo SOAP).
Linha 20: Instanciamos ela.
Linha 23: Passamos a chave simétrica (poderiamos gerar uma nova, mas ela precisa ser identica a chave do cliente).
Linha 25: Seta a chave na classe.
Linha 26: Seta o texto a ser criptografado.
Linha 27: Criptogra o texto.
Linha 28: Pega o texto de forma hexadecimal (É necessário para que os dados circulem no protocolo SOAP).
Resultado

Mensagem de Resposta do SOAP
Resposta
HTTP/1.1 200 OK
Date: Wed, 27 Sep 2006 18:59:46 GMT
Server: Apache/2.0.59 (Win32) mod_ssl/2.0.52 OpenSSL/0.9.8 PHP/5.1.4
X-Powered-By: PHP/5.1.4
X-SOAP-Server: NuSOAP/0.7.2 (1.94)
Content-Length: 552
Connection: close
Content-Type: text/xml; charset=ISO-8859-1
Resposta
HTTP/1.1 200 OK
Date: Wed, 27 Sep 2006 18:59:46 GMT
Server: Apache/2.0.59 (Win32) mod_ssl/2.0.52 OpenSSL/0.9.8 PHP/5.1.4
X-Powered-By: PHP/5.1.4
X-SOAP-Server: NuSOAP/0.7.2 (1.94)
Content-Length: 552
Connection: close
Content-Type: text/xml; charset=ISO-8859-1
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:helloResponse xmlns:ns1="http://tempuri.org"><return xsi:type="xsd:string">aKV17SE6pL6WnkW/FhFcKw4X1LtqHeMdW+e3nr4rLtc=
</return></ns1:helloResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
</return></ns1:helloResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Como podem ver, a mensagem voltou criptografada.
Podemos fazer o mesmo procedimento utilizando-se das chaves assimétricas, podendo enviar a chave pública junto a mensagem.
Ex.: O cliente passa os paramentos nome e a chave pública, o servidor recebe, gera a mensagem e criptografa com a chave pública recebi e retorna a mensagem para o cliente, que utiliza-se da chave privada para decriptografar a mensagem.
Porém o envio das chaves se torna um processo um tanto quanto "pesado".
Uma saída seria utilizar as chaves assimétricas para a transmissão de chaves simétricas. Ou seja, criptografa-se uma chave simétrica utilizando-se a chave pública assimétrica para uma troca segura de chaves, a partir daí utiliza-se as chaves simétricas entre 2 pontos para uma comunicação segura.
Bom, era isso pessoal, simples e objetivo.
Qualquer dúvida estamos ai.
Abraço.
Olá, estou desenvolvendo um aplicativo, que irá rodar dentro do meu servidor.
ResponderExcluirE só poderá acessar pessoas que assinaram esse conteúdo.
Isso deixa meu conteúdo bem seguro?Sem ter medo de roubo e falhas?
Não achei aqui os fontes para download... =/