A geração da assinatura

Propaganda
UNIVERSIDADE FEDERAL DE SANTA CATARINA
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE CIÊNCIAS DA COMPUTAÇÃO
Dispositivo móvel para geração de
assinaturas digitais curtas
Andrey Morais Brüggemann
0313203-0
Florianópolis – SC
2007/1
Sumário
Introdução.......................................................................................................3
Objetivo ..........................................................................................................5
Assinatura Digital ............................................................................................6
A geração da assinatura..............................................................................7
A verificação da assinatura .........................................................................8
Digital Signature Algorithm..............................................................................9
Geração da assinatura ................................................................................9
Verificação da assinatura .......................................................................... 11
Secure Hash Standard ..................................................................................12
Advanced Encryption Standard .....................................................................13
Java2 Micro Edition ......................................................................................14
Configuração.............................................................................................15
Connected Limited Device Configuration ...............................................15
Connected Device Configuration ...........................................................16
Perfil..........................................................................................................16
Referências Bibliográficas ................................................................................................................. 17
Introdução
Normalmente, para se poder acessar este tipo de sistema, deve ser que fornecidos
um nome de usuário cadastrado no sistema e a senha associada a este usuário, para se
poder autenticar no sistema e então utilizá-lo. O nome de usuário normalmente é de
acesso público, ou seja, qualquer outra pessoa além do dono pode saber, enquanto que a
senha deve ser de conhecimento apenas de seu dono. Uma vez verificada a
concordância entre a senha e o nome de usuário, fornecidos, obtém-se acesso ao
sistema.
Nesta autenticação, tem-se um fator de autenticação, a senha. Somente ela
garante que quem esta entrando no sistema com um dado nome de usuário é realmente o
dono deste nome, ou seja, é a senha que garante a identidade do usuário. Esta
segurança pode ser facilmente quebrada, bastando que alguém veja um outro digitando
sua senha e a grave, ou capture o envio da senha pela rede e a leia, para poder entrar no
sistema fingindo ser o verdadeiro dono da senha, já que o nome de usuário e público e
pode ser facilmente obtido.
Apesar da insegurança que se tem quando apenas a senha é utilizada, esta é
muitas vezes suficiente, principalmente em sistemas em que poucas informações do
usuário são manipuladas. Porém há sistemas em que a segurança na autenticação é
primordial, ou seja, deve-se ter certeza de que quem está realizando as operações no
sistema é realmente a pessoa autenticada, pois praticamente toda informação manipulada
é confidencial. Como exemplo de situação onde a segurança na troca de informação é
primordial, pode-se citar as transações bancárias.
Um outro problema está no caminho de troca de informações. Ao menos que se
garanta a privacidade do caminho que se utiliza para trocar as informações, ou seja, que
ninguém compartilha deste caminho além do usuário e o sistema, toda informação
trocada entre o usuário e o sistema pode ser capturada no meio do envio, e então ser
alterada e enviada ao destino. O problema de interceptação uma informação trocada está,
não somente em se poder ler esta informação, mas também em se poder alterá-la em
envia-la ao destino. Isso se agrava ainda mais com o uso da internet como meio de
transmissão, o acesso à rede é público.
A fim de resolver o problema de interceptação, surgiram as tecnologias de chaves,
como chaves simétricas e chaves assimétricas, e também de cifragem de dados. Ainda,
devido a fragilidade do uso de apenas a senha como fator de autenticação, como,
assinatura digital e certificado digital, que se utilizam da tecnologia de chaves
assimétricas. É possível, inclusive, que mais de um destes fatores passa ser utilizado ao
mesmo tempo.
Objetivo
Implementar um dispositivo móvel de autenticação, utilizando assinatura digital
curta de 32 bits, baseada no Digital Signature Algorithm (DSA), usando JAVA 2 Micro
Edition (J2ME) como plataforma de desenvolvimento e tendo o celular como hardware de
execução. O dispositivo deverá suportar:

Geração dos parâmetros do DSA.

Geração de assinatura curta, usando algoritmo DSA adaptado.

Cifragem e decifragem, usando AES.

Armazenamento dos parâmetros do DSA.
Assinatura Digital
Normalmente para se demonstrar a aceitação do conteúdo de um documento, por
exemplo um contrato, tem-se que escrever uma assinatura sobre este documento. A
assinatura de um indivíduo é única, dependente da caligrafia de cada um. Como a
assinatura está presente nos documentos de identificação, alguém com posse, por
exemplo, da carteira de identidade de quem assinou o documento, pode conferir a
autenticidade da assinatura. Da mesma forma, se a assinatura de uma certa pessoa está
presente em um documento, ela não pode negar que assinou, salvo os casos em que há
falsificação.
A assinatura digital é uma forma de autenticação análoga a assinatura manuscrita
de um indivíduo, utilizada para assinar mensagens, estas podendo ser tanto mensagens
de e-mail propriamente ditas quanto arquivos. Basicamente , uma assinatura digital nada
mais é do que uma seqüência de dígitos binários, gerada por um algoritmo
computacional.
A assinatura digital proporciona características de segurança tais como:

Autenticação: o receptor da mensagem pode confirmar a identidade do signatário.

Integridade: o receptor pode verificar se a mensagem recebida é a mesma enviada
pelo signatário, ou seja, se ela foi ou não alterada durante o envio.

Não-repúdio: tendo assinado uma mensagem, o signatário não pode negar que
realizou a assinatura.
Os esquemas de assinatura digital normalmente são compostos dois processos,
uma para a geração da assinatura e outro para a verificação da mesma, ambos
envolvendo algoritmos de cifragem assimétrica e hash.
A geração da assinatura
Para gerar uma assinatura primeiramente o remetente obtém o código hash da
mensagem a ser enviada. Este código é obtido através de uma algoritmo de hash, o qual
retorna uma saída de tamanho fixo e pequeno, para qualquer que seja a mensagem de
entrada.
Então, o hash calculado é cifrado usando a chave privada do remetente, a qual
deve ter sido previamente gerada.
Este hash, agora cifrado, é a assinatura digital
propriamente dita. O rementente da mensagem, o qual gerou a assinatura passa a ser
chamado signatário.
Por fim, a assinatura digital é enviada juntamente com a mensagem original para
para o destinatário, que pode assim verificar a autenticidade do remetente bem como a
integridade da mensagem que recebeu.
A verificação da assinatura
Figura 1.: Processo de geração da assinatura
Para que seja possível que o destinatário verifique ele deve ter recebido
previamente a chave pública do signatário da mensagem. Normalmente este envio é feito
através de certificados digitais, para que haja uma garantia de que a chave pública
recebida é realmente do remetente, signatário da mensagem.
Tendo a chave pública, a assinatura a mensagem recebidos, o destinatário decifra
a assinatura digital, obtendo o possível código hash da mensagem. Depois, da mesma
forma que acontece no processo de geração, é calculado o código hash da mensagem
recebida.
Por fim, os dois códigos hash obtidos são comparados. Se iguais, então a
assinatura e a mensagem são consideradas válidas, caso contrário, inválidas. A
invalidade por ocorrer por diversos motivos, como corrupção da informação durante o
envio ou tentativa de ataque malicioso.
Figura 2: Processo de verificação da assinatura
Digital Signature Algorithm
O Digital Signature Algorithm (DSA) é um algoritmo de assinatura digital proposto
pelo NIST (National Institute of Standards and Technology)
como integrante de seu
padrão para assinaturas digitais, o Digital Signature Standard (DSS), em agosto de 1991.
Ele foi publicado em maio de 1994, na FIPS-186 (Federal Information Processing
Standard). Em 1998, foi publicada a FIPS-186-1, que adicionou o algoritmo rDSA (Digital
Signatures Using Reversible Public Key Cryptography ) , especificado pelo ANSI X9.31.
Posteriomente, em 1999, uma nova alteração foi feita e publicada na FIPS-186-2, a qual
adicionou o algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm), definido pelo
ANSI X9.62.
O algoritmo das utiliza chaves de tamanho entre 512 e 1024 bits, porém esta
limitação está para ser mudada através de uma nova revisão do NIST, a FIPS-186-3, que
está em fase de rascunho. Esta nova publicação estabelece tamanhos de chave como
2048 e 3072 bits.
Geração da assinatura
O primeiro passo do algoritmo é a geração dos parâmetros, chamados parâmetros
de domínio. Antes da geração dos parâmetros algumas decisões devem ser tomadas:

Escolher um algoritmo de hash H. No DSS original o algoritmo SHA-1 é utilizado
por padrão, porém como surgiram algoritmos de hash mais avançados, pode-se
utilizá-los, bastando truncar a saída para o mesmo tamanho da saída do SHA-1.

Escolher o tamanho L da chave a ser utilizada. Segundo o padrão original, o
tamanho deve ser um múltiplo de 64, entre 512 e 1024. Com a definição da FIPS196-3, esta tamanho poderá ser maior.
Tomadas as decisões, deve-se gerar os seguintes parâmetros:

p: um primo de tamanho L.

q: um primo divisor de p-1, com número de bits igual a saída da função hash
escolhida.

g: um número calculado pela fórmula g = h(p-1)/q mod p, onde h é qualquer número
menor que p-1 e h(p-1)/q mod p > 1

x: um inteiro aleatório, tal que 0 < x < q.

y: calculado pela fórmua y = gx mod p.

k: um inteiro aleatório, tal que 0 < k < q. Este parâmetro deve ser único por
mensagem.
Os parâmetros p, q, g são públicos. O parâmetros y é a chave pública e x a chave
privada. O parâmetro k é secreto e deve ser gerado novamente a cada geração de
assinatura.
A geração da assinatura para uma mensagem M consiste no cálculo de dois
números r e s tal que:

r = (gk mod p ) mod q

s = (k-1(H(M)+xr)) mod q. H(M) representa a saída da função hash H tendo como
entrada a mensagem M.

Se r = 0 ou s = 0, então o parâmetro k deve ser gerado novamente e r e s devem
ser calculados de novo.
A assinatura resultante é a união dos parâmetros r e s. Como r tem 160 bits e s
também, então a assinatura gerada possui 320 bits.
Os números k e r, bem como k-1, poderiam ser pré-calculados, pois não dependem
da mensagem a ser assinada, acelerando desta forma a geração da assinatura.
Verificação da assinatura
Para poder verificar a assinatura, o verificador deve possuir os parâmetros p, q, g e
a chave pública do signatário. Isto pode ser feito de forma segura através de um
certificado digital, assinado por alguém confiável.
Sendo M1, r1 e s1 as informações recebidas pelo verificador, a verificação da
assinatura ocorre da seguinte maneira.

São verificadas as condições 0 < r1 < q e 0 < s1 < q . Se uma das condições não
for satisfeita, então a assinatura é considerada inválida. Caso contrário
prosseguem os seguintes passos:

Calcula w = (s1)-1 mod q

Calcula u1 = (H(M1)*w) mod q

Calcula u2 = (r1*w) mod q

Calcula v = ((gu1*yu2) mod p) mod q
Se v = r1 a assinatura é válida. Caso contrário, inválida.Secure
Hash
Standard
O Secure Hash Standard (SHS) é um padrão adotado pelo NIST que especifica um
conjunto de algoritmos de função de hash, chamados de Secure Hash Algorithm (SHA). A
primeira publicação do padrão, o FIPS-180-1, continha apenas o algoritmo SHA-1.
O algoritmo SHA-1 suporta entradas de tamanho até 264 bits, retorna um hash com
tamanho fixo de 160 bits. Este algoritmo foi criado especialmente para servir o das e teve
como base o MD4. O uso do SHA-1 no DSA se faz necessário para aumentar o
desempenho do algoritmo, já que assinar o hash da mensagem é muito mais rápido que
assinar a mensagem em si, pois o tamanho do hash é muito menor.
Em 2002, foi lançada a FIPS-180-2, pelo NIST, adicionando um novo conjunto de
algoritmos ao padrão, os quais ficaram conhecidos como família SHA-2. Três novos
algoritmos foram adicionados nesta publicação, sendo eles o SHA-256, SHA-384 e SHA512, grando códigos hash de 256, 384 e 512 bits, respectivamente. Depois, em 2004, um
novo algoritmo foi acrescentado, o SHA-224, que gera saídas de 224 bits. A criação de
novos algoritmos se fez necessária para compatibilizar com os novos algoritmos
criptográficos que surgiram.
Foi divulgado, em 2005, um ataque ao SHA-1 que diminuiria o esforço em
aproximadamente 269 operações para encontrar uma colisão, ou seja, duas mensagens
gerando o mesmo hash, sendo que o requerido para o SHA-1 ser considerado seguro
eram 280 operações. Desde então o NIST tem recomendado a troca do SHA-1 por algum
algoritmo da família SHA-2.
Segundo a FIPS-180-2 CHANGE NOTICE 1, em casos onde é necessário um hash
de menor que saída de um algoritmo SHA-2, pode- truncar a saída algoritmo tomando os
bits mais à esquerda como hash.
Advanced Encryption Standard
Em 1997, o NIST iniciou sua procura por um novo algoritmo de cifragem simétrica,
que service como substituto do DES (Data Encryption Standard). O DES era
recomendado pela instituição desde 1977, publicado na FIPS PUB 46, mas acabou sendo
considerado inseguro devido aos vários anúncios de ataques realizados sobre ele.
Um dos substitutos propostos foi o algoritmo Rijndael, criado por Joan Daemen e
Vincent Rijmen. Este algoritmo usa uma rede de permutação e substituição em lugar da
rede de Feistel, como ocorria no DES. Isto o tornava mais rápido e simples de ser
implementado. O Rijndael aceita diversos tamanhos de chave e bloco, podendo ser
qualquer múltiplo de 32, entre 128 e 256.
Após algumas modificações, o Rijndael, foi publicado em 2001, na FIPS-197, como
um novo padrão para cifragem simétrica, com o nome de Advanced Encryption Standard
(AES). O AES suporta chaves de 128, 192 ou 256 bits e blocos de 128bits, ao contrário
do Rijndael original, que aceitava um maior número de tamanhos diferentes, tanto para a
chave quanto para o bloco.
Java2 Micro Edition
O Java2 Micro Edition (J2ME), é uma variação da plataforma Java surgida em
1999, como uma iniciativa da empresa Motorola, que uni-se a Sun para produzir uma
plataforma que promovesse portabilidade às suas aplicações de celulares. Mais que
somente a celulares, a plataforma J2ME visa atender qualquer dispositivo com recursos
limitados de processamento, memória e rede, tais como PDAs (Personal Digital
Assistants) , set-top-boxes, utilizados nos sistemas de TV digital, e celulares.
Diferente dos outros padrões, como J2SE e J2EE, os quais se dedicam a
equipamentos com capacidades semelhantes, o J2ME tem de atender as mais variadas
configurações de hardware, as quais na maioria das vezes não podem ter sua capacidade
estendida, como o que ocorre com os computadores pessoais.
Devido a isto o J2ME não possui uma única distribuição e sim várias subdivisões
destinadas a atender um conjunto específico de dispositivos. Estas subdivisões ocorrem
em dois níveis diferentes: a configuração, num nível mais baixo ou básico, e o perfil.
Figura 3: Arquitetura do J2ME
Configuração
A divisão por configuração leva em conta o hardware presente no dispositivo, ou
seja, capacidade que o este possui em termos de processamento, memória e acesso à
rede. Ela define as características da máquina virtual que irá atender o dispositivo e
também as classe básicas do Java que estarão disponíveis.
Atualmente há duas configurações definidas, a Connected Limited Device
Configuration (CLDC) e a Connected Device Configuration (CDC) .
Connected Limited Device Configuration
A CLCD define uma plataforma mínima para que a máquina virtual possa operar, e
um quantidade pequena de classe básicas da plataforma Java. Exemplos típicos de
dispositivos CLCD são os PDAs e os celulares. Por este motivo, muitas vezes a CLCD é
chamada Java Wireless, referenciando a capacidade do usuário poder baixar pela rede
pequenos aplicativos Java, chamados MIDlets, e executá-los no dispositivo.
As características, quanto a capacidade dos dispositivos CLCD são as seguintes:

160kB a 512kB de memória disponível para a plataforma Java.

Processador de 16 ou 32 bits.

Baixo consumo de energia. Normalmente estes dispositivos utilizam bateria.

Suporte a algum tipo de conexão com um rade. Geralmente esta conexão é
intermitente, com baixa taxa de tranferência, próxima a 9600 bps, e sem fio
(wireless).
A máquina virtual utilizada pela CLCD é a Kilobyte Virtual Machine (KVM). A KVM é
uma máquina virtual limitada, que utiliza pouca memória, algo entre 40kb a 80 kb, o que a
torna muito adequada aos dispositivos CLCD.
Connected Device Configuration
A CDC se destina à dispositivos com mais recursos que a CLCD. Ela requer pelo
menos 2Mb de memória para a plataforma Java. A máquina virtual utilizada é a C-Virtual
Machine (CVM), a qual implementa todas as funcionalidades da máquina virtual padrão,
contida no J2SE, com algumas diferenças na implemntação. Exemplos de dispositivos
CDC são os Pocket PCs, gateways residenciais e set-top-boxes utilizados na transmissão
de TV digital.
Perfil
O perfil está associado as funcionalidades que o dispositivo apresenta. Ele define o
conjunto de APIs implementadas pelo dispositivo. Há dispositivos com mesma
capacidade, isto é, de uma mesma configuração, que implementam diferentes perfis. Os
dispositivos suportado por um determinado perfil tente a ter uma aplicabilidade parecida.
O primeiro perfil especificado pela Sun, lançado em 2000, foi justamento o que
estabelece o modelo de aplicação e as APIs para os telefones celulares. Este perfil é o
Mobile Information Device Profile (MIDP), cuja tradução é Perfil para terminais móveis de
Informação. Estre as características definidas pelo MIDP estão:

um modelo de aplicação similar ao Applet, chamado MIDlet

APIs de acesso à tela do telefone

APIs de acesso à rede.

APIs para salvar dados locais

uma estrutura para baixar, instalar e rodar aplicações.
Apesar de outros perfis terem sido definidos, o MIDP é o mais
utilizado no desenvolvimento de aplicações para celular.
Atualmente ele se encontra na versão 2.0, mas uma nova
especificação, MIDP 3.0, já está em andamento.Referências
Bibliográficas
NIST FIPS 180-2.Secure Hash Standard. Federal Information Processing Standards.
National Institute of Standards and Technology. FIPS PUB 180-2 (+Change Notice to
include SHA-224), 2004.
NIST FIPS 186-2. Digital Signature Standard. Federal Information Processing Standards.
National Institute of Standards and Technology. FIPS PUB 186-2, 2000.
NIST FIPS 197. Advanced Encryption Standard (AES). Federal Information Processing
Standards. National Institute of Standards and Technology. FIPS PUB 197, 2001.
MENEZES, A., OORSCHOT, P. C. e Vanstone, S. A. Handbook of Applied Cryptography,
CRC Press, 1996.
WHITE, James; HEMPHILL, David. Java 2 Micro Edition: Java in Small Things. Greewich:
Manning, 2002.
JAVA MAGAZINE. Rio de Janeiro: Devmedia, 2007. Edição 44.
MUNDO JAVA. Rio de Janeiro: Mundo, 2007. Número 16.
Download