java cryptography architecture (jca) segurança e privacidade em sistemas de armazenamento e...

Post on 17-Apr-2015

108 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Java Cryptography Architecture(JCA)

Segurança e Privacidade em Sistemas de Armazenamento e Transporte de Dados

MSDPA-0607

Rui Manuel C. O. Afonseca

Índice

JCA Princípios Arquitectura Principais Objectos

Exemplo Problema Resolução Conceptual (4 Camadas) Camada Criptográfica Detalhes de Implementação (JCA)

Protocolos de Comunicação Certificados X.509

Conclusões

JCA - Princípios

Independente da plataforma (Java) Fornece uma API para serviços

criptográficos Independente da implementação Extensível

JCA - Arquitectura

Engine Classes Define abstractamente um serviço criptográfico (sem

implementação). Providers

Packages que fornecem implementações de serviços criptográficos.

Provider SUN Provider fornecido por omissão.

Provider IAIK Mais completa e está integrada de forma elegante com a

API para manipulação de estruturas de dados ASN.1 Java Cryptography Extension (JCE)

Extensão à JCA que inclui técnicas criptográficas mais poderosas. (Opcional até a versão 1.4)

JCA / JCE– Principais Objectos

JCA Signature X509Certificate KeyStore

JCE Cipher KeyGenerator SealedObject

Exemplo

Proposto pelo Professor Manuel Bernardo Barbosa, DI, U. Minho – Criptografia Aplicada 2003/2004

Implementação de uma aplicação de Chat Funcionalidades protegidas por técnicas criptográficas Identificação e anonimato dos utilizadores Estabelecimento de canais seguros de comunicação

Com servidores Ligações ponto a ponto (peer-to-peer)

Mensagens off-line etc.

Exemplo – Aplicação de Chat

Sala de Conversação

Conversação Privada

Entidades do Sistema

Autoridade de Certificação Externa Autoridade de Certificação Dedicada Servidor de Chat Cliente de Chat

Ligações Seguras

1. Cliente – Servidor• Envelope Digital

2. Cliente – Cliente• Station-to-Station

3. Cliente – Chat CA• Chave Publica

4. Servidor – Chat CA• Chave Publica

Desenho Conceptual

Camada de Interface Swing Awt

Camada operacional Thread’s

Camada criptográfica Security IAIK

Camada de Rede Socket’s

4 Camadas

Interface

Operacional

CriptográficaRede

Comunicações Seguras

Envelope Digital Entidade “A” cria a chave simétrica K “A” cifra K com a chave publica de “B” “A” envia o criptograma para “B” “B” decifra o criptograma com a sua chave

privada e obtém K

Comunicações Seguras (cont.)

Station To Station “A” gera um número aleatório grande x “A” calcula X = gx (mod n) e envia-o ao “B” “B” gera um número aleatório grande y “B” calcula Y = gy (mod n) e envia-o ao “A” Ambos conseguem calcular K = Xy (mod n) = Yx (mod n) Acordada a chave de sessão K, os agentes assinam digitalmente

o par ordenado (X, Y) Estas assinaturas são trocadas entre os agentes, cifradas com a

chave acordada Caso as assinaturas sejam recuperadas e verificadas com

sucesso o protocolo terminou com sucesso

DH

Melhora-mento

StationToStation (Passo 1 de 3) AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance("DH"); apg.init(512);

AlgorithmParameters ap = apg.generateParameters();

DHParameterSpec dhsp = (DHParameterSpec) ap.getParameterSpec(DHParameterSpec.class); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); BigInteger x = new BigInteger(512, random); BigInteger gx = dhsp.getG().modPow(x, dhsp.getP());

oos.writeObject(gx); BigInteger gy = (BigInteger) ois.readObject(); BigInteger k = gy.modPow(x, dhsp.getP());

Determinar Chave K

512 bits = 64 B => [99999999999999999999999999999999999999999999999999999999999999]

StationToStation (Passo 2 de 3) DESKeySpec sks = new DESKeySpec(k.toByteArray());

SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");

SecretKey sk = skf.generateSecret(sks);

Cipher enc = Cipher.getInstance("DES/ECB/PKCS5Padding","IAIK")

enc.init(Cipher.ENCRYPT_MODE, sk);

Cipher dec = Cipher.getInstance("DES/ECB/PKCS5Padding");

dec.init(Cipher.DECRYPT_MODE, sk);

Signature sig = Signature.getInstance("SHA1withRSA");

sig.initSign(mypri);

sig.update(gx.toByteArray());

sig.update(gy.toByteArray());

byte[] assinaturaXY = sig.sign();

SealedObject sigXY = new SealedObject(assinaturaXY, enc);

oos.writeObject(sigXY);

Inicialização

Assinar

Cifrar

Enviar

StationToStation (Passo 3 de 3)

SealedObject sigXY2 = (SealedObject) ois.readObject();

byte[] assinaturaXY2 = (byte[]) sigXY2.getObject(dec);

sig.initVerify(pub);

sig.update(gx.toByteArray());

sig.update(gy.toByteArray());

if( sig.verify(assinaturaXY2) ){ return true;}

else{ return false;}

Ler o criptograma

Decifrar – Obter a assinatura

Verificar assinatura

Certificados X.509

Autoridades de Certificação Emitem certificados Revogam certificados (CRL / OCSP)

Clientes Criam pedidos de certificado Verificam validade de certificados Assinam mensagens (chave privada) Cifram mensagens (chave publica)

Criar Certificado (Passo 1 de 2)

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

kpg.initialize(1024,sr);

KeyPair clikp = kpg.generateKeyPair();

PrivateKey cliPri = clikp.getPrivate();

PublicKey cliPub = clikp.getPublic();

X509Certificate x509cert = new X509Certificate();

GregorianCalendar date = (GregorianCalendar)Calendar.getInstance();

x509cert.setValidNotBefore(date.getTime());

date.add(Calendar.MONTH, p_duracao);

x509cert.setValidNotAfter(date.getTime());

Gerar par de chaves

Definir data de validade

Instanciar

Criar Certificado (Passo 2 de 2)

x509cert.setIssuerDN(p_certCA.getSubjectDN());

Name subject = new Name();

subject.addRDN(ObjectID.country, p_pais);

subject.addRDN(ObjectID.organization, p_organization);

subject.addRDN(ObjectID.organizationalUnit, p_organizationUnit);

subject.addRDN(ObjectID.commonName, p_nome);

x509cert.setSubjectDN(subject);

x509cert.setSerialNumber(p_serial);

x509cert.setPublicKey(cliPub);

x509cert.sign(AlgorithmID.sha1WithRSAEncryption, p_mypri);

Informação sobre o titular do certificado

Assinar o certificado

Quem assina o certificado

Nº série

Chave publica

Validar Certificado

1. Validar cadeia de certificados

2. Verificar que não está na CRL

3. Verificar o resultado do pedido OCSP• Good• Revoked• Unknown

Validar cadeia de certificados … //Construir o ramo de certificados p_Array_cert …

SimpleChainVerifier scv = new SimpleChainVerifier();

scv.addTrustedCertificate( p_trusted_cert );

if (scv.verifyChain( p_Array_cert ) ) {{ return true;}

else{ return false;}

Instanciar

Definir os certificados de confiança

Verificar a cadeia de certificados

(Datas, assinaturas, etc.)

Conclusões

Permite a escolha das implementações mais convenientes

As principais técnicas criptográficas estão contempladas, permitindo criar qualquer tipo de aplicação segura

Necessário perceber como funcionam algumas técnicas criptográficas

Nível de detalhe Permite grande controlo Pode originar falhas de segurança graves

Java Cryptography Architecture(JCA)

Segurança e Privacidade em Sistemas de Armazenamento e Transporte de Dados

MSDPA-0607

Rui Manuel C. O. Afonseca

top related