Segredo Partilhado Documento: MBNet
Transcrição
Segredo Partilhado Documento: MBNet
MBNet Segredo Partilhado Documento: MBNet - Segredo Partilhado_PT 0022.doc Versão: 00.22 Data: 2006-05-20 Classificação: Confidencial © June 2006, SIBS, SA A informação contida neste documento é propriedade da SIBS, SA e não pode ser duplicada, publicada ou divulgada a terceiros, na totalidade ou em parte, sem o prévio consentimento por escrito da Sociedade Interbancária de Serviços, SA, o qual nunca deverá ser presumido. O seu conteúdo está tão correcto quanto possível e pode ser alterado pela SIBS em qualquer momento e sem ser dado conhecimento prévio. SIBS, SA - Sociedade Interbancária de Serviços Rua Soeiro Pereira Gomes, Lote 1, 1649-031 LISBOA, PORTUGAL Telefone: +351-217 813 000 / Fax: +351- 217 935 665 Documento Confidencial Versão 00.22, 2006-05-20 Ficha Técnica Título do Documento: Assunto: Unidade de Estrutura: Empresa: Classificação do Documento: MBNet Segredo Partilhado DSQSQ SIBS Confidencial Lista de Distribuição: Palavras-chave: MBNet, Segredo Partilhado, Segurança, HASH Nome do Ficheiro: MBNet - Segredo Partilhado_PT 0022.doc ID do Documento: DSQSQ-2006-001 Páginas: 13 Revisões DATA VERSÃO 2006-05-20 00.22 MBNet Segredo Partilhado DESCRIÇÃO Criação do documento em português Página 2 Documento Confidencial Versão 00.22, 2006-05-20 Índice 1 Introdução ........................................................................................................... 5 1.1 1.2 1.3 2 Segredo Partilhado............................................................................................... 6 2.1 3 Objectivos ..................................................................................................... 5 Estrutura do documento................................................................................... 5 Referências .................................................................................................... 5 Geração e Validação do C013............................................................................ 6 2.1.1 A chave como parâmetro de entrada para o cálculo do C013 Segredo Partilhado............................................................................................. 6 2.1.2 O texto como parâmetro de entrada para o cálculo do C013 Segredo Partilhado7 2.1.3 Validação do C013 Segredo Partilhado ...................................................... 7 Anexo A – Funções de Hash ................................................................................. 8 3.1 Algoritmo de Secure Hash ................................................................................ 8 3.1.1 Descrição ............................................................................................. 8 3.1.2 Formato de entrada ............................................................................... 8 3.1.3 Formato de saída................................................................................... 9 3.1.4 Referência à norma................................................................................ 9 3.1.5 Exemplos de implementação ................................................................... 9 3.2 HMAC com SHA-1: Keyed-Hashing para Autenticação de Mensagens .................... 10 3.2.1 Descrição ........................................................................................... 10 3.2.2 Referencia à norma.............................................................................. 11 3.2.3 Casos de teste e exemplos de implementação.......................................... 11 4 Annex B - Exemplo de cálculo de C013 Segredos partilhados............................. 12 4.1.1 4.1.2 Exemplo 1 .......................................................................................... 12 Exemplo 2 .......................................................................................... 13 MBNet Segredo Partilhado Página 3 Documento Confidencial Versão 00.22, 2006-05-20 Figuras Figure 1 Exemplo do cartão do comerciante ..................................................................... 6 MBNet Segredo Partilhado Página 4 Documento Confidencial Versão 00.22, 2006-05-20 1 Introdução 1.1 Objectivos Este documento tem como objectivo descrever o processo computacional do criptograma C013, denominado por Segredo Partilhado, utilizado no serviço MBNet. 1.2 Estrutura do documento Este documento cobre os seguintes tópicos: • Geração e Validação do C013 Segredo Partilhado; • Funções de HASH com exemplos e guias de implementação. 1.3 Referências • Infra-estrutura do Terminal de Pagamento Automático Virtual - Documento Técnico Comerciante. MBNet Segredo Partilhado Página 5 Documento Confidencial Versão 00.22, 2006-05-20 2 Segredo Partilhado Para proteger a integridade de alguns elementos de dados partilhados entre o servidor do comerciante e o servidor de MBNet, o algoritmo Secure HMAC, baseado no algoritmo SHA-1, é usado de forma a poder ser gerado o criptograma C013 Segredo Partilhado. 2.1 Geração e Validação do C013 O cálculo computacional do C013 Segredo Partilhado terá lugar em dois cenários distintos: • No momento de um post para o servidor MBNet – um C013 Segredo Partilhado terá que ser gerado e incluído na mensagem a enviar ao comerciante; • Na recepção de uma mensagem do servidor de MBNet – o servidor tem que gerar um C013 Segredo Partilhado e compará-lo com o que é recebido na mensagem recebida; Em ambos os cenários, o C013 Segredo Partilhado deverá ser calculado com o algoritmo de HMAC em função do texto e da chave de entrada. 2.1.1 A chave como parâmetro de entrada para o cálculo do C013 Segredo Partilhado A chave utilizada para o cálculo do C013 Segredo Partilhado será o número em relevo inscrito no cartão do comerciante. Figura 1 Exemplo de cartão de comerciante Neste exemplo a chave é: Key = "966004100350000010008" (ASCII format) = 39 36 36 30 30 34 31 30 30 33 35 30 30 30 30 30 31 30 30 30 38 (HEX format) MBNet Segredo Partilhado Página 6 Documento Confidencial Versão 00.22, 2006-05-20 2.1.2 O texto como parâmetro de entrada para o cálculo do C013 Segredo Partilhado O texto a usar no cálculo do C013 Segredo Partilhado será o resultado da concatenação de todos os campos da mensagem. Esta concatenação terá que cumprir as seguintes regras: • Campos numéricos: Deverão ser completados (padded) com zeros à esquerda de forma a atingir o seu tamanho máximo. Como exemplo, o campo A001 (Número do TPA Virtual, N 09) com o conteúdo "1234" deverá ser transformado em "000001234"; O separador decimal (o ponto decimal) deverá ser retirado. Como exemplo, o campo A061 (Montante da Operação, N08) com o conteúdo "1.25" deverá ser transformado em "00000125"; Se o campo for opcional (e não for enviado na mensagem ou no form), então deverá ser usado o valor zero. • Campos alfanuméricos: Os caracteres de espaço (" ") à esquerda e à direita deverão ser eliminados. Se o campo for opcional (e não for enviado na mensagem ou no form), então este não deverá ser incluído no texto. 2.1.3 Validação do C013 Segredo Partilhado Para cada resposta recebida do servidor do MBNet que inclui o C013 Segredo Partilhado, o servidor do comerciante deverá validar a integridade dos dados calculando o C013 Segredo Partilhado sobre os dados especificados e comparando com o C013 Segredo Partilhado recebido. Se este teste falhar, então não poderá haver confiança sobre os dados recebidos. MBNet Segredo Partilhado Página 7 Documento Confidencial Versão 00.22, 2006-05-20 3 Anexo A – Funções de Hash 3.1 Algoritmo de Secure Hash CalculateSHA1 (Text Length, Text) Input Code Name Text Length Text Format B B Lgth. 2 var Contents Name SHA-1 Digest Format B Lgth. 20 Contents Output Code 3.1.1 Descrição O algoritmo SHA-1 é uma função de HASH sem chave que toma uma mensagem de comprimento finito como parâmetro de entrada e que produz um resultado de comprimento fixo conhecido como message digest, hash-value, ou simplesmente hash. O resultado do SHA-1 é um valor de 160 bits que assume uma representação comprimida do texto de entrada. A especificação oficial do algoritmo é a norma FIPS 180-1. Deve-se ter um cuidado especial com os formatos de entrada e de saída dos campos. 3.1.2 Formato de entrada O texto de entrada deverá ser visto como uma sequência de bits (bitstring) independentemente do seu formato ser ASCII ou valores hexadecimais puros. O comprimento do texto deverá representar o número de bytes do texto de entrada. Seleccionando, por exemplo, o primeiro vector de testes da norma oficial obtém-se: SHA1 ("abc") = SHA1 (0x 616263) = CalculateSHA1 (0x0003, 0x616263) MBNet Segredo Partilhado Página 8 Documento Confidencial Versão 00.22, 2006-05-20 3.1.3 Formato de saída A ordem dos bytes no campo de saída é frequentemente origem de problemas. Por causa desta problemática denominada de endianess (alguns sistemas são big-endian enquanto outros são little-endian) o resultado poderá por vezes ser mal interpretado. No caso do Hash o valor de saída, de 160 bits, resulta da concatenação de 5 words de 32-bits: SHA-1 Digest = H1 || H2 || H3 || H4 || H5 O resultado do SHA-1 é uma sequência de bytes que começam nos bytes de ordem superior do H1 e terminam com os bytes de ordem menor do H5, Para exemplo anterior, o resultado será: SHA1 (0x 616263) = 0x A9993E364706816ABA3E25717850C26C9CD0D89D Em contraposição ao seguinte valor errado: SHA1 (0x 616263) = 0x 363E99A96A81064771253EBA6CC250789DD8D09C. 3.1.4 Referência à norma FIPS 180-1, "Secure Hash Standard", Federal Information Processing Standards Publication 180-1, <http://www.nist.gov/sha>, U.S. Department of Commerce/N.I.S.T., National Technical Information Service, Springfield, Virginia, 1995 April 17 (Supersedes FIPS PUB 180 - 1993 May 11). 3.1.5 Exemplos de implementação Os seguintes endereços de internet disponibilizam exemplos de implementação que cumprem a norma SHA-1. Public Domain C Implementation: Steve Reid, <http://ftp.task.gda.pl/pub/security/crypto/HASH/sha/> Public Domain C++ Implementation: Wei Dai, <http://www.eskimo.com/~weidai/cryptlib.html> Public Domain JAVA Implementation: Jef Poskanzer, <http://www.acme.com/resources/classes/Acme/Crypto/ShaHash.java> MBNet Segredo Partilhado Página 9 Documento Confidencial Versão 00.22, 2006-05-20 Public Domain JAVASCRIPT Implementation: Paul Johnston, <http://pajhome.org.uk/crypt/md5/sha1src.html> 3.2 HMAC com SHA-1: Keyed-Hashing para Autenticação de Mensagens CalculateHmacWithSha1 (Key Length, Key, Text Length, Text) Input Code Name Key Length Key Format B B Text Length Text B B Lgth. 1 up to 64 2 var Name HMAC Format B Lgth. 20 Contents less than 20 bytes is strongly discouraged Output Code Contents 3.2.1 Descrição Tipicamente os MACs (message authentication codes) são utilizados entre dois partidos que partilham um segredo. O HMAC é um mecanismo que calcula MACs fazendo uso de funções de Hash. Neste documento são apresentadas implementações do mecanismo de HMAC usando a função de Hash SHA-1, sem modificações. O resultado de HMAC com SHA-1 é um valor com 160-bits. A chave de autenticação pode ser de qualquer comprimento até 64 bytes; o comprimento interno de um bloco na função de Hash SHA-1. O comprimento mínimo recomendado para esta chave é de 20 bytes, i.e. o cumprimento do resultado da função SHA-1. A especificação oficial do algoritmo é o documento RFC-2104. O cálculo do HMAC com SHA-1 sobre um dado texto "TEXT" usando uma chave "K" é executado através dos seguintes passos: Passo 1. Padding de Chaves Acrescentar zeros à direita de “k” para criar uma sequência de 64 bytes de comprimento (por exemplo, se “k” tiver 20 bytes de comprimento, então devem-se acrescentar a “k” 44 bytes com conteúdo zero - 0x00). Append zeros to the end of K to create a 64-byte long string (e.g., if K is 20 bytes long, then K will be appended with 44 zero bytes 0x00). MBNet Segredo Partilhado Página 10 Documento Confidencial Versão 00.22, 2006-05-20 K' = K [|| 00 || 00 || … || 00 ] Passo 2. Primeiro Hash Efectuar um XOR (OU-exclusivo ao nível do bit) entre a sequência K' e a sequência (ipad) que consiste no byte 0x36 repetido 64 vezes. Append the input TEXT to the result of the previous XOR and calculate an SHA1 over it. Acrescentar o texto de entrada ao resultado do XOR anterior e calcular um SHA1 sobre esse valor. temp = CalculateSHA1 ((K' xor (0x36..0x36)) || TEXT) 20 64 64 var Passo 3. Segundo Hash Efectuar um XOR (OU-exclusivo ao nível do bit) entre a sequência K' e a sequência (opad) que consiste no byte 0x5C repetido 64 vezes. Append the temp string (calculated in the previous step) to the result of the previous XOR and calculate an SHA1 over it. Acrescentar a sequência temp (calculada no passo anterior) ao resultado do XOR anterior e calcular um SHA1 sobre esse valor. HmacWithSha1 = CalculateSHA1 ((K' xor (0x5C..0x5C)) || temp) 20 64 64 20 FIPS 180-1, "Secure Hash Standard", Federal Information Processing Standards Publication 180-1, <http://www.nist.gov/sha>, U.S. Department of Commerce/N.I.S.T., National Technical Information Service, Springfield, Virginia, 1995 April 17 (Supersedes FIPS PUB 180 - 1993 May 11). 3.2.2 Referencia à norma RFC 2104, "HMAC: Keyed-Hashing for Message Authentication", Network Working Group Request for Comments: 2104, <ftp://ftp.isi.edu/in-notes/rfc2104.txt>, H. Krawczyk, M. Bellare and R. Canetti, February 1997. 3.2.3 Casos de teste e exemplos de implementação RFC 2202, "Test Cases for HMAC-MD5 and HMAC-SHA-1", Network Working Group Request for Comments: 2202, <ftp://ftp.isi.edu/in-notes/rfc2202.txt>, P. Cheng and R. Glenn, September 1997. MBNet Segredo Partilhado Página 11 Documento Confidencial Versão 00.22, 2006-05-20 4 Annex B - Exemplo de cálculo de C013 Segredos partilhados A chave usada nestes exemplos é a seguinte: Key = "966004100350000010008" (ASCII format) = 39 36 36 30 30 34 31 30 30 33 35 30 30 30 30 30 31 30 30 30 38 (Hex format). 4.1.1 Exemplo 1 Input Field Format field1 field1 field2 field3 field4 field5 field6 field7 field8 field9 N4 N9 N15 N4 N8 N1 N 16 N6 C3 C 128 Contents "H005" "1262" "8989999990" "9782" "52.00" "0" "4279679800009876" "200406" "286" " http://www.comerciante.pt " Filtered Contents "H005" "000001262" "000008989999990" "9782" "00005200" "0" "4279679800009876" "200406" "286" "http://www.comerciante.pt" Text = Concatenation of all filtered fields = "H00500000126200000898999999097820000520004279679800009876200406286http://www.co merciante.pt" (ASCII format) = 48 30 30 35 30 30 30 30 30 31 32 36 32 30 30 30 30 30 38 39 38 39 39 39 39 39 39 30 39 37 38 32 30 30 30 30 35 32 30 30 30 34 32 37 39 36 37 39 38 30 30 30 30 39 38 37 36 32 30 30 34 30 36 32 38 36 68 74 74 70 3A 2F 2F 77 77 77 2E 63 6F 6D 65 72 63 69 61 6E 74 65 2E 70 74 (Hex format) Passo 1. Padding de Chaves K' = Key [|| 00 || 00 || … || 00 ] = 39 36 36 30 30 34 31 30 30 33 35 30 30 30 30 30 31 30 30 30 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (Hex format) Passo 2. Primeiro Hash K' xor (0x36..0x36) = 0F 00 00 06 06 02 07 06 06 05 03 06 06 06 06 06 07 06 06 06 0E 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 (Hex format) temp = CalculateSHA1 ((K' xor (0x36..0x36)) || TEXT) = FC A8 83 52 5D 4C 4A 2D 3F E0 A4 07 FB 96 F7 28 87 B0 CD 5E (Hex format) MBNet Segredo Partilhado Página 12 Documento Confidencial Versão 00.22, 2006-05-20 Passo 3. Segundo Hash K' xor (0x5C..0x5C) = 65 6A 6A 6C 6C 68 6D 6C 6C 6F 69 6C 6C 6C 6C 6C 6D 6C 6C 6C 64 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C (Hex format) C013 = HmacWithSha1 = CalculateSHA1 ((K' xor (0x5C..0x5C)) || temp) = 6E 7C 0F 1B 07 F6 E3 52 05 62 4B C6 78 63 E1 1B 10 8D E2 BC (Hex format) 4.1.2 Exemplo 2 Input Field Format field1 field2 field3 field4 field5 field6 field7 field8 field9 N4 N9 N15 N4 N8 N1 N 16 N6 C3 Contents "H3D0" "1425" "1234567890" "9782" "12.34" "0" "4798123456789009" "200412" "" Filtered Contents "H3D0" "000001425" "000001234567890" "9782" "00001234" "0" "4798123456789009" "200412" "" Text = Concatenation of all fields = "H3D000000142500000123456789097820000123404798123456789009200412" (ASCII format) = 48 33 44 30 30 30 30 30 30 31 34 32 35 30 30 30 30 30 31 32 33 34 35 36 37 38 39 30 39 37 38 32 30 30 30 30 31 32 33 34 30 34 37 39 38 31 32 33 34 35 36 37 38 39 30 30 39 32 30 30 34 31 32 (Hex format) Passo 1. Padding de Chaves K' = Key [|| 00 || 00 || … || 00 ] = 39 36 36 30 30 34 31 30 30 33 35 30 30 30 30 30 31 30 30 30 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (Hex format) Passo 2. Primeiro Hash K' xor (0x36..0x36) = 0F 00 00 06 06 02 07 06 06 05 03 06 06 06 06 06 07 06 06 06 0E 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 (Hex format) temp = CalculateSHA1 ((K' xor (0x36..0x36)) || TEXT) = 32 2A B9 E0 56 C2 39 0E FA C8 6E F7 DC BE 5A 08 A5 E1 68 C2 (Hex format) Passo 3. Segundo Hash K' xor (0x5C..0x5C) = 65 6A 6A 6C 6C 68 6D 6C 6C 6F 69 6C 6C 6C 6C 6C 6D 6C 6C 6C 64 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C (Hex format) C013 = HmacWithSha1 = CalculateSHA1 ((K' xor (0x5C..0x5C)) || temp) = 6B A7 B8 4F 4E F2 F0 85 A8 9B 00 9D E9 50 84 78 0B 3F 56 8A (Hex format) MBNet Segredo Partilhado Página 13