MSDPA0607 Java Cryptography Architecture JCA Segurana e Privacidade

  • Slides: 22
Download presentation
MSDPA-0607 Java Cryptography Architecture (JCA) Segurança e Privacidade em Sistemas de Armazenamento e Transporte

MSDPA-0607 Java Cryptography Architecture (JCA) Segurança e Privacidade em Sistemas de Armazenamento e Transporte de Dados Rui Manuel C. O. Afonseca

Índice n JCA ¡ ¡ ¡ n Princípios Arquitectura Principais Objectos Exemplo ¡ ¡

Índice n JCA ¡ ¡ ¡ n Princípios Arquitectura Principais Objectos Exemplo ¡ ¡ Problema Resolução Conceptual (4 Camadas) Camada Criptográfica Detalhes de Implementação (JCA) n n n Protocolos de Comunicação Certificados X. 509 Conclusões

JCA - Princípios n n Independente da plataforma (Java) Fornece uma API para serviços

JCA - Princípios n n Independente da plataforma (Java) Fornece uma API para serviços criptográficos Independente da implementação Extensível

JCA - Arquitectura n Engine Classes ¡ n Provider fornecido por omissão. Provider IAIK

JCA - Arquitectura n Engine Classes ¡ n Provider fornecido por omissão. Provider IAIK ¡ n Packages que fornecem implementações de serviços criptográficos. Provider SUN ¡ n Define abstractamente um serviço criptográfico (sem implementação). 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 n JCA ¡ ¡ ¡ n Signature X 509

JCA / JCE– Principais Objectos n JCA ¡ ¡ ¡ n Signature X 509 Certificate Key. Store JCE ¡ ¡ ¡ Cipher Key. Generator Sealed. Object

Exemplo n n n n Proposto pelo Professor Manuel Bernardo Barbosa, DI, U. Minho

Exemplo n n n n 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 Privada

Exemplo – Aplicação de Chat Sala de Conversação Privada

Entidades do Sistema n n Autoridade de Certificação Externa Autoridade de Certificação Dedicada Servidor

Entidades do Sistema n n Autoridade de Certificação Externa Autoridade de Certificação Dedicada Servidor de Chat Cliente de Chat

Ligações Seguras Cliente – Servidor 1. • Envelope Digital Cliente – Cliente 2. •

Ligações Seguras Cliente – Servidor 1. • Envelope Digital Cliente – Cliente 2. • Station-to-Station Cliente – Chat CA 3. • Chave Publica Servidor – Chat CA 4. • Chave Publica

Desenho Conceptual n n Camada de Interface ¡ Swing ¡ Awt Camada operacional ¡

Desenho Conceptual n n Camada de Interface ¡ Swing ¡ Awt Camada operacional ¡ Thread’s Camada criptográfica ¡ Security ¡ IAIK Camada de Rede ¡ Socket’s 4 Camadas Interface Operacional Criptográfica Rede

Comunicações Seguras n Envelope Digital ¡ ¡ Entidade “A” cria a chave simétrica K

Comunicações Seguras n 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” decifra o criptograma com a sua chave privada e obtém K

Comunicações Seguras (cont. ) n Station To Station ¡ ¡ DH ¡ ¡ Melhoramento

Comunicações Seguras (cont. ) n Station To Station ¡ ¡ DH ¡ ¡ Melhoramento ¡ ¡ “A” gera um número aleatório grande x “A” calcula X = gx (mod n) e envia-o ao “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

Station. To. Station (Passo 1 de 3) Algorithm. Parameter. Generator apg = Algorithm. Parameter.

Station. To. Station (Passo 1 de 3) Algorithm. Parameter. Generator apg = Algorithm. Parameter. Generator. get. Instance("DH"); apg. init(512); Algorithm. Parameters ap = apg. generate. Parameters(); DHParameter. Spec dhsp = (DHParameter. Spec) ap. get. Parameter. Spec(DHParameter. Spec. class); Secure. Random random = Secure. Random. get. Instance("SHA 1 PRNG"); Big. Integer x = new Big. Integer(512, random); Big. Integer gx = dhsp. get. G(). mod. Pow(x, dhsp. get. P()); oos. write. Object(gx); Big. Integer gy = (Big. Integer) ois. read. Object(); Determinar Chave K Big. Integer k = gy. mod. Pow(x, dhsp. get. P()); 512 bits = 64 B => [9999999999999999999999999999999]

Station. To. Station (Passo 2 de 3) DESKey. Spec sks = new DESKey. Spec(k.

Station. To. Station (Passo 2 de 3) DESKey. Spec sks = new DESKey. Spec(k. to. Byte. Array()); Secret. Key. Factory skf = Secret. Key. Factory. get. Instance("DES"); Secret. Key sk = skf. generate. Secret(sks); enc. init(Cipher. ENCRYPT_MODE, sk); Cipher dec = Cipher. get. Instance("DES/ECB/PKCS 5 Padding"); dec. init(Cipher. DECRYPT_MODE, sk); Inicialização Cipher enc = Cipher. get. Instance("DES/ECB/PKCS 5 Padding", "IAIK") Signature sig = Signature. get. Instance("SHA 1 with. RSA"); sig. init. Sign(mypri); sig. update(gx. to. Byte. Array()); sig. update(gy. to. Byte. Array()); byte[] assinatura. XY = sign(); Sealed. Object sig. XY = new Sealed. Object(assinatura. XY, enc); oos. write. Object(sig. XY); Assinar Cifrar Enviar

Station. To. Station (Passo 3 de 3) Sealed. Object sig. XY 2 = (Sealed.

Station. To. Station (Passo 3 de 3) Sealed. Object sig. XY 2 = (Sealed. Object) ois. read. Object(); Ler o criptograma byte[] assinatura. XY 2 = (byte[]) sig. XY 2. get. Object(dec); Decifrar – Obter a assinatura sig. init. Verify(pub); sig. update(gx. to. Byte. Array()); sig. update(gy. to. Byte. Array()); if( sig. verify(assinatura. XY 2) ) { return true; } else { return false; } Verificar assinatura

Certificados X. 509 n Autoridades de Certificação ¡ ¡ n Emitem certificados Revogam certificados

Certificados X. 509 n Autoridades de Certificação ¡ ¡ n 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) Key. Pair. Generator kpg = Key. Pair. Generator.

Criar Certificado (Passo 1 de 2) Key. Pair. Generator kpg = Key. Pair. Generator. get. Instance("RSA"); Secure. Random sr = Secure. Random. get. Instance("SHA 1 PRNG"); kpg. initialize(1024, sr); Key. Pair clikp = kpg. generate. Key. Pair(); Gerar par de chaves Private. Key cli. Pri = clikp. get. Private(); Public. Key cli. Pub = clikp. get. Public(); X 509 Certificate x 509 cert = new X 509 Certificate(); Gregorian. Calendar date = (Gregorian. Calendar)Calendar. get. Instance(); x 509 cert. set. Valid. Not. Before(date. get. Time()); date. add(Calendar. MONTH, p_duracao); x 509 cert. set. Valid. Not. After(date. get. Time()); Instanciar Definir data de validade

Criar Certificado (Passo 2 de 2) x 509 cert. set. Issuer. DN(p_cert. CA. get.

Criar Certificado (Passo 2 de 2) x 509 cert. set. Issuer. DN(p_cert. CA. get. Subject. DN()); Quem assina o certificado Name subject = new Name(); subject. add. RDN(Object. ID. country, p_pais); subject. add. RDN(Object. ID. organization, p_organization); subject. add. RDN(Object. ID. organizational. Unit, p_organization. Unit); Informação sobre o titular do certificado subject. add. RDN(Object. ID. common. Name, p_nome); x 509 cert. set. Subject. DN(subject); x 509 cert. set. Serial. Number(p_serial); Nº série x 509 cert. set. Public. Key(cli. Pub); Chave publica x 509 cert. sign(Algorithm. ID. sha 1 With. RSAEncryption, p_mypri); Assinar o certificado

Validar Certificado Validar cadeia de certificados Verificar que não está na CRL Verificar o

Validar Certificado Validar cadeia de certificados Verificar que não está na CRL Verificar o resultado do pedido OCSP 1. 2. 3. • • • Good Revoked Unknown

Validar cadeia de certificados … //Construir o ramo de certificados p_Array_cert … Simple. Chain.

Validar cadeia de certificados … //Construir o ramo de certificados p_Array_cert … Simple. Chain. Verifier scv = new Simple. Chain. Verifier(); scv. add. Trusted. Certificate( p_trusted_cert ); if (scv. verify. Chain( 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 n n Permite a escolha das implementações mais convenientes As principais técnicas criptográficas

Conclusões n n 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

MSDPA-0607 Java Cryptography Architecture (JCA) Segurança e Privacidade em Sistemas de Armazenamento e Transporte

MSDPA-0607 Java Cryptography Architecture (JCA) Segurança e Privacidade em Sistemas de Armazenamento e Transporte de Dados Rui Manuel C. O. Afonseca