Gestao e Seguranca de Redes - SSL 'Secure Socket Layer'
Índice
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
Introdução
Com o uso cada vez mais
comercial da Internet, a necessidade de um método seguro de criptografia e
comunicação dos dados transmitidos entre cliente e servidor tornou-se óbvia.
Este é o ponto de atuação do SSL.
SSL é uma camada do protocolo de rede,
situada exatamente abaixo da camada de aplicação (Figura 1), com a responsabilidade de
gerenciar um canal de comunicação seguro entre o cliente e o
servidor. O SSL foi desenvolvido pela Netscape Communications Corporation e,
atualmente é implementado na maioria dos browsers da WWW tais como o Netscape e
o Internet Explorer. A palavra-chave https:// é usualmente empregada para designar uma conexão
segura. O SSL encontra-se atualmente na versão 3.0.

Figura 1
As Vantagens do SSL
O SSL preenche
os seguintes critérios que o fazem aceitável para o uso nas transmissões das
mais sensíveis informações, como dados pessoais e números do cartão de
crédito. A aplicação pode optar entre utilizar todos ou somente uma parte
desses critérios dependendo do tipo e natureza das transações que estão
sendo efetuadas.
![]() |
Privacidade |
Digamos que uma mensagem é transmitida de A
para B. Neste caso A usa a chave
pública de B para criptografar a mensagem, tornando B a
única pessoa que pode decodificar a mensagem, usando a sua chave privada. Nós
não podemos entretanto ter certeza quanto a identidade de A.
![]() |
Autenticidade |
De modo a garantir a autenticidade de A no
caso anterior, um sistema de códigos um pouco mais complexo é necessário. A
mensagem de A para B é primeiramente criptografada com a chave
privada de A e posteriormente com a chave pública de B. Para
decodificar a mensagem B usa primeiro sua chave privada e depois a chave
pública de A. Agora B pode ter certeza de que A é
realmente quem diz ser, pois ninguém mais poderia criptografar a mensagem
usando a chave privada de A. Isso é desenvolvido pelo SSL com o uso de
certificados.
![]() |
Integridade |
No SSL, a integridade é garantida pelo uso do
MAC (Message Authentication Code) com as necessárias funções da tabela hash. Na
geração de uma mensagem, o MAC é obtido por aplicação das funções da tabela
hash e é codificado junto com a mensagem. Após a mensagem ser recebida sua
validade pode ser checada comparando-se o MAC com o resultado obtido pela
reversão das funções hash . Isto previne mensagens alteradas por terceiros
durante a transmissão.
![]() |
Não Repudiação |
A segurança das transações é dependente
das chaves de criptografia. Se uma dessas chaves cair em mãos erradas, pode ser
facilmente duplicada e usada para comprometer a segurança. Um sistema
totalmente seguro deve ser capaz de detectar impostores ou, ainda melhor, se prevenir
contra a duplicação das chaves. Isto é executado por um hardware baseado em
ficha única.O SSL não suporta sozinho esta
implementação, mas a realiza em conjunto com Fortezza.
Algoritmos Criptográficos usados com o SSL
O protocolo SSL suporta uma variedade de
diferentes algoritmos criptográficos, ou Ciphers, para uso em
operações de autentificação do servidor e do cliente, transmissão de
certificados, e estabelecimento de sessões. Clientes e servidores podem
suportar um Cipher diferente, ou um conjunto de Ciphers, dependendo de fatores
como qual versão de SSL eles (cliente e servidor) suportam, políticas da
companhia a respeito da força aceitável de criptografia, e restrições
governamentais para exportação do software SSL. Além de outras funções, é
o protocolo de Handshake do SSL que determina como cliente e servidor
negociam quais conjuntos de cipher vão usar para se autenticar um para o outro,
para transmitir certificados, e para estabelecer sessões.
Os conjuntos de ciphers descritos acima se
referem aos seguintes algoritmos:
![]() |
DES - Data Encryption Standard, é um algoritmo de
criptografia usado pelo governo americano.
|
![]() |
DSA - Digital Signature Algorithm, parte do padrão
de autentificação digital usado pelo governo americano.
|
![]() |
KEA - Key Exchange Algorithm, um algoritmo usado
para a troca de chaves pelo governo americano.
|
![]() |
MD5 - Message Digest Algorithm, algoritmo de
criptografia digest.
|
![]() |
RC2 e RC4 - Rivest Encryption Ciphers, desenvolvido
pela RSA Data Security.
|
![]() |
RSA - Algoritmo de chave pública para
criptografia e autentificação.
|
![]() |
RSA Key Exchange - Algoritmo para troca de chaves
usado em SSL baseado no algoritmo RSA.
|
![]() |
SHA-1
- Secure Hash Algorithm, função hash usada pelo governo
americano.
|
![]() |
SKIPJACK
- Algoritmo de chave simétrica implementado no hardware Fortezza.
|
![]() |
Triple-DES
- é o DES aplicado três vezes.
|
Algoritmos de troca de chaves como KEA e RSA Key Exchange governam a maneira
pela qual clientes e servidores determinam as chaves simétricas que usarão
durante uma sessão com SSL. O mais comumente usado é o RSA Key Exchange.
Quando um cliente e um servidor trocam informações durante o Handshake do SSL,
eles identificam o algoritmo habilitado mais forte que eles tenham em comum e,
passam a usá-lo na sessão. Para servir ao maior grupo possível de usuários,
os administradores podem habilitar o maior conjunto de algoritmos de cifragem
possível.Alguns organizadores desabilitam os algoritmos mais fracos para
evitar uma conexão SSL com tais algoritmos.
Fortezza Cipher Suites
Fortezza é um sistema de criptografia usado pelas agências do governo
americano para manejar informações sensíveis porém não confidenciais. Ele
provê uma implementação de hardware de dois ciphers desenvolvidos pelo
governo: Fortezza KEA e SKIPJACK. O cipher Fortezza para SSL usa o KEA ao invés
do RSA Key Exchange, e o DSA para autentificação do cliente.
Introdução às Chaves Criptográficas
A chave pública de criptografia RSA é
amplamente usada para autentificação e codificação na indústria de
computadores. A Netscape tem licença junto a RSA Data Security Inc. para usar
tal chave em seus produtos, especificamente para autentificação.
Criptografia com chave pública é a técnica
que usa um par de chaves assimétricas para criptografar e decodificar. Cada
par de chaves consiste numa chave pública e outra privada. A chave pública é
feita pública através de uma distribuição. A chave privada nunca é
distribuída, sendo mantida sempre em segredo.
O dado que é criptografado com uma chave
pública somente pode ser decodificado com a chave privada. Alternativamente, o
dado criptografado com a chave privada somente pode ser decodificado com a chave
pública. Esta é a propriedade que faz com que a Criptografia com chave
pública seja tão usada.
Usando Criptografia com Chave Pública para Autentificação
Autentificação é o processo de
verificação da identidade para que uma entidade tenha certeza de que a outra
entidade é quem ela realmente diz ser. No exemplo abaixo, envolvendo Roberto
e Camila, podemos verificar que a criptografia com chave pública é
facilmente utilizada para verificar a identidade. Supondo que Camila
queira autenticar Roberto:
![]() |
Roberto tem um par de chaves, uma pública e
outra privada. Por meios que serão discutidos mais tarde Roberto
revela para Camila sua chave pública. Camila então gera
uma mensagem aleatória e a manda para Roberto:
|
Camila ==>
Roberto
mensagem aleatória
![]() |
Roberto usa sua chave privada para criptografar a mensagem e a envia de
volta para Camila:
|
Roberto ==>
Camila
mensagem criptografada com
a chave privada de
Roberto
![]() |
Camila recebe a mensagem e a decodifica usando a chave pública de Roberto.
Se ao fazer a comparação das duas mensagens ( a mensagem original
gerada, e a mensagem decodificada), Camila verificar que são iguais,
saberá então que está realmente falando com Roberto. Um impostor
presumivelmente não poderia conhecer a chave privada de Roberto e, conseqüentemente
não poderia criptografar de maneira correta a mensagem para Camila
checar.
|
Assinatura Digital
A menos que você saiba exatamente o que
está criptografando, nunca é uma boa idéia criptografar alguma coisa
com sua chave privada e depois enviar para outra pessoa. Essa criptografia pode
ser usada contra você (lembre-se, só você poderia ter feito a criptografia
pois só você tem a chave privada).
Portanto, ao invés de criptografar a
mensagem enviada por Camila, Roberto constrói uma mensagem digest,
e a criptografa. Uma mensagem digest é derivada da mensagem
aleatória, de maneira que possui úteis propriedades, descritas a seguir:
![]() |
O digest é muito difícil de reverter. Se
determinada pessoa tenta se passar por Roberto não conseguirá
obter a mensagem original de volta a partir do digest.
|
![]() |
Um falsificador terá grande dificuldade em obter uma
mensagem diferente que compute o mesmo valor da digest.
|
Com o uso do digest, Roberto pode
portanto se proteger. Ele cria um digest da mensagem aleatória enviada
por Camila e, então criptografa o resultado. O digest criptografado é
então mandado de volta para Camila, que pode computar o mesmo digest e
autenticar Roberto decodificando a mensagem recebida e comparando os
valores.
A técnica descrita acima é conhecida como
assinatura digital. Conseqüentemente nosso protocolo de autentificação será incrementado:
Camila ==>
Roberto Oi,
você é o Roberto?
Roberto ==>
Camila Camila,
aqui é o Roberto.
{ digest [Camila, aqui é o Roberto] }
chave privada - Roberto
Roberto envia primeiro a versão não
criptografada da mensagem "Camila, aqui é o Roberto".
Então ele manda a versão criptografada - digest. Camila pode
agora facilmente verificar se Roberto é realmente Roberto.
Distribuição da Chave Pública
Como Roberto pode disponibilizar sua
chave pública de uma maneira segura? Vejamos como o protocolo de
autentificação nos parece:
Camila ==>
Roberto Oi
Roberto ==>
Camila Oi, eu
sou o Roberto,
'chave pública do Roberto'
Camila ==>
Roberto Prove
isso
Roberto ==>
Camila Camila,
aqui é o Roberto
{ digest [Camila, aqui é o Roberto] }
chave privada - Roberto
Com esse protocolo qualquer um pode se passar
por Roberto. Tudo o que se precisa é de uma chave pública e outra
privada. Você mente para Camila e diz que é Roberto, e manda sua
chave pública. Então você prova isso criptografando alguma coisa usando sua
chave privada, e Camila não poderá dizer que você não é Roberto.
Para resolver esse problema foi criado um
certificado. O certificado tem o seguinte conteúdo:
![]() |
O nome do emissor do certificado
|
![]() |
A entidade para quem o certificado está sendo emitido
|
![]() |
A chave pública da pessoa
|
![]() |
Alguns selos de tempo
|
O certificado é assinado
usando a chave privada do emissor do certificado. Certificados
são um meio padrão de ligar uma chave pública a um nome.
Por meio dessa tecnologia de certificado,
todos podem examinar o certificado de Roberto para ver se está sendo
forjado. Assumindo que Roberto tenha rígido controle sobre sua chave
privada, e que seja realmente Roberto quem obteve o certificado, então tudo
está bem. Agora vejamos como fica o protocolo:
Camila ==>
Roberto Oi
Roberto ==>
Camila Oi, eu
sou o Roberto, 'Certificado - Roberto'
Camila ==>
Roberto prove
Roberto ==>
Camila {
digest [Camila, aqui é o Roberto] }
chave privada - Roberto
Agora quando Camila receber a primeira
mensagem de Roberto, poderá examinar o certificado, checar a assinatura
(usando o digest e a decodificação com a chave pública), e então
checar a pessoa, confirmando ou não a autenticidade de Roberto. Ela pode
então acreditar que a chave pública é a chave pública de Roberto, e
pedir que Roberto prove sua identidade. Roberto segue o mesmo processo
descrito anteriormente, gerando o digest e respondendo para Camila. Ela
verifica a mensagem de Roberto usando a chave pública tirada do certificado.
Suponha que uma pessoa que chamaremos de X
faça o seguinte:
Camila ==>
X Oi
X ==>
Camila Oi, eu
sou o Roberto, 'Certificado - Roberto'
Camila ==>
X prove
X ==>
Camila ?????
Portanto X não conseguiu convencer Camila
na mensagem final. X não tem a chave privada de Roberto, portanto
não conseguiu construir uma mensagem que Camila acredita estar vindo
de Roberto.
Trocando um Segredo
Uma vez que Camila tenha autenticado Roberto,
ela pode fazer uma outra coisa - pode mandar uma mensagem que somente
Roberto pode decodificar:
Camila ==>
Roberto {
segredo } - criptografado com a
chave publica de Roberto
A única maneira de ler o segredo é
decodificando a mensagem acima com a chave privada de Roberto. Trocas de
segredos é outro poderoso meio de uso da criptografia com chave pública. Mesmo
que tenham outras pessoas observando a comunicação entre Roberto e Camila,
ninguém a não ser Roberto pode ler o segredo.
Essa técnica fortalece a segurança na
internet. Camila conhece o segredo porque ela o gerou. Roberto
conhece o segredo porque possui a chave privada e pode decodificar a mensagem
enviada por Camila. Como os dois conhecem o segredo, podem agora iniciar
um algoritmo de cifragem simétrica para o envio de mensagens entre eles.
Vejamos como fica agora o protocolo:
Camila ==>
Roberto Oi
Roberto ==>
Camila Oi, eu
sou o Roberto, 'Certificado - Roberto'
Camila ==>
Roberto prove
Roberto ==>
Camila Camila,
aqui é o Roberto
{ digest [ Camila, aqui é o Roberto] }
chave privada -
Roberto
Camila ==>
Roberto Ok
Roberto, aqui está um segredo
{segredo} chave pública - Roberto
Roberto ==>
Camila {mensagem qualquer} -chave
secreta
Apesar de X (o invasor) não
conseguir descobrir o segredo que Camila e Roberto estão
trocando, ele pode interferir na conversa danificando-a. Por exemplo, se X está
situado entre Camila e Roberto,pode escolher passar a maior parte da
informação de um lado para outro, porém deturpando certas mensagens:
Camila ==>
X Oi
X ==> Roberto Oi
Roberto ==> X Oi,
eu sou o Roberto, 'Certificado - Roberto'
X ==>
Camila Oi, eu
sou o Roberto, 'Certificado - Roberto'
Camila ==>
X prove
X ==> Roberto
prove
Roberto ==> X
Camila, aqui é o Roberto
{ digest [Camila, aqui é o Roberto] }
chave privada - Roberto
X ==>
Camila
Camila, aqui é o Roberto
{ digest [Camila, aqui é o Roberto] }
chave privada - Roberto
Camila ==>
X Ok
Roberto, aqui está um segredo
{segredo} chave pública - Roberto
X ==>
Roberto Ok
Roberto, aqui está um segredo
{segredo} chave pública - Roberto
Roberto ==>
X {mensagem
qualquer} - chave secreta
X ==>
Camila
mensagem alterada
[ {mensagem qualquer} - chave secreta]
X passa os dados entre Camila e
Roberto até que eles troquem um segredo. Então X altera a
mensagem de Roberto para Camila. Neste ponto Camila
acredita em Roberto, portanto ela vai considerar a mensagem alterada como
verdadeira, e usá-la. Note que X não sabe o segredo - tudo o que ele
fez foi danificar a mensagem criptografada com a chave secreta.
Para prevenir este tipo de dano, Camila
e Roberto podem introduzir um código de autentificação de
mensagem -
MAC (message authentication code) no seu protocolo. Um MAC é um pedaço
de dado
que é computado usando um segredo e alguns dados transmitidos. O
algoritmo digest descrito acima tem justamente as mesmas propriedades da
construção de
uma função MAC, que pode defender contra os ataques de X.
MAC := Digest [mensagem
qualquer, segredo]
Devido ao fato de que X não conhece o
segredo, ele não pode computar o valor certo do digest. Se X
alterar aleatoriamente uma mensagem, sua chance de sucesso é tão menor
quanto maior for o digest. Por exemplo, usando MD5 ( um bom algoritmo de
criptografia digest criado pela RSA), Camila e Roberto podem enviar um
MAC de 128 bits com suas mensagens. As chances de X descobrir o MAC correto é
de 1 em 18,446,744,073,709,551,616 - ou para propósitos práticos, nenhuma.
Vejamos agora como fica o protocolo:
Camila ==>
Roberto Oi
Roberto ==>
Camila Oi, eu
sou o Roberto, 'Certificado - Roberto'
Camila ==>
Roberto prove
Roberto ==>
Camila Camila,
aqui é o Roberto
{ digest [Camila, aqui é o Roberto] }
chave privada - Roberto
Camila ==>
Roberto Ok
Roberto, aqui está um segredo
{segredo} chave pública - Roberto
Roberto ==>
Camila {mensagem
qualquer,MAC}chave secreta
X terá problemas agora para alterar
as mensagens trocadas por Camila e Roberto. Quando uma mensagem
for alterada, o valor MAC vai também ser alterado possibilitando com que Camila
ou Roberto descubram a fraude.
Camadas do Protocolo SSL

![]() |
SSL Handshake |
O SSL suporta vários protocolos de alto nível, e um deles é o protocolo
Handshake, que é usado para coordenar os estados entre cliente e servidor.
Durante o handshaking ocorrem os seguintes eventos:
Certificados são trocados entre o cliente e o servidor para provar suas
identidades. A chave pública do servidor é retirada desse certificado.
O cliente então gera um grupo de chaves aleatórias, que serão usadas para a
criptografia dos dados, e para a geração dos MACs. As chaves aleatórias são
criptografadas usando a chave pública do servidor e então enviadas para o
servidor.
O algoritmo de criptografia
das mensagens e a função hash para a integridade, são negociadas. Esse
processo de negociação pode ser feito da seguinte maneira: o cliente apresenta
a lista de algoritmos suportados, e o servidor seleciona o mais forte que seja
comum para os dois. Identificadores da escolha do algoritmo de criptografia e da
função hash são armazenados no cipher spec field do estado corrente
para ser usado pelo Record Protocol.O método de compressão também é
determinado durante o handshaking.
![]() |
Change Cipher Spec Protocol |
É usado para notificar a outra parte a respeito de mudanças na estratégia de
criptografia. A nova estratégia de criptografia precisa ser previamente
negociada e então armazenada no Cipher Spec. A mudança no protocolo consiste
em uma mensagem de 1 byte que é criptografada e comprimida usando o Cipher Spec
corrente. Ela sinaliza que os dados subseqüentes serão protegidos usando as
novas chaves, e o novo Cipher Spec.
![]() |
Alert Protocol |
Consiste de mensagens de alerta. Pode chegar ao extremo de ser um nível fatal
de mensagem de alerta, o qual resultaria no encerramento da
conexão.
![]() |
SSL Record Protocol |
A camada SSL Record encapsula vários protocolos de alto nível, e usa a
definição de estado corrente para, além de outras coisas, selecionar os
algoritmos de compressão e criptografia apropriados. O estado corrente é
determinado durante o processo de handshaking previamente descrito.
Ela age comprimindo os
dados, usando o algoritmo de compressão selecionado no estado corrente. Todos
os dados são protegidos usando os algoritmos de criptografia e MAC definidos no
Cipher Spec corrente, que é parte do estado corrente. O algoritmo MAC utiliza
um Message Authentication Code e uma função hash para assegurar a integridade
dos dados.
Os processos descritos acima são
reversíveis na Camada Record, no outro lado do canal de comunicações, onde os
dados são decodificados, verificados, expandidos e reunidos antes de serem
enviados para clientes em alto nível.
Para encerrar uma sessão, uma das
partes envia uma mensagem comunicando esse fato (Close Notify). Caso o cliente
queira estabelecer nova sessão com o servidor, pode fornecer seu identificador
de sessão em sua mensagem de início, dando assim continuidade a sessão
estabelecida anteriormente.
Restrições de Exportação da Tecnologia Criptográfica
A segurança na World Wide Web entre
links internacionais é comprometida pela política de segurança de certos
países como Suécia, França e Estados Unidos. A tecnologia de criptografia de
dados é considerada por esses países de grande importância militar, havendo
portanto um controle na exportação de tais tecnologias. Nos Estados Unidos as
implementações em SSL usam criptografias de 128 bits, enquanto que para
produtos destinados a exportação são permitidos somente criptografias de 40
bits.
Tal política levou as companhias
americanas, como a Netscape, a implementar duas versões dos seus produtos: uma
voltada para o mercado interno com 128 bits de criptografia, e outra para
exportação com 40 bits de criptografia.
Referências
![]() |
|
![]() |
|
![]() |
|
![]() |
Network Security Essentials - William Stallings
|
Comentários
Enviar um comentário
De seu comentario acerca desta aula, sua dica, sua critica ou sugestao para que eu possa melhorar o conteudo deste Blog. Obrigado Pela Atencao dispensada boa aula a todos.