Webly: Criptografia SHA-1 - Webly

Ir para

IMPORTANTE: Todos os tutoriais postados neste fórum irão automaticamente para o portal Webly. Contribua você também e faça parte da equipe de colaboradores que fazem a evolução da web. Obrigado.


Página 1 de 1

Criptografia SHA-1 Avaliar tópico: -----

#1 Membro offline   Storm Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 23
  • Cadastrado: 21-agosto 06

Postou 02 dezembro 2006 - 11:12

O (Secure Hash Algorithm) está relacionada com as funções criptográficas. A função mais usada nesta família, a SHA-1, é usada numa grande variedade de aplicações e protocolos de segurança, incluindo TLS, SSL, PGP, SSH, S/MIME, and IPSec. SHA-1 foi considerado o sucessor do MD5. Ambos têm vulnerabilidades comprovadas. Em algumas correntes, é sugerido que o SHA-256 ou superior seja usado para tecnologia crítica. Os algoritmos SHA foram desenhados pela National Security Agency (NSA) e publicados como um standard do governo Norte-Americano.

O primeiro membro da família, publicado em 1993, foi oficialmente chamado SHA; no entanto, é frequentement chamado SHA-0 para evitar confusões com os seus sucessores. Dois anos mais tarde, SHA-1, o primeiro sucessor do SHA, foi publicado. Desde então quatro variantes foram lançadas com capacidades de saída aumentadas e um design ligeiramente diferente: SHA-224, SHA-256, SHA-384, e SHA-512 — por vezes chamadas de SHA-2.

Foram feitos ataques a ambos SHA-0 e SHA-1. Ainda não foram reportados ataques às variantes SHA-2, mas como elas são semelhantes ao SHA-1, pesquisadores estão preocupados, e estão a desenvolver candidatos para um novo e melhor standard de hashing.

É o algoritmo utilizado no eMule para identificar arquivos duplicados.

Este algoritmo já é disponibilizado integralmente em inglês,

Para facilitar a vida como já tinha falado anteriormente e fechando o ciclo de criptografia de algoritmos, traduzi e adaptei com comentários o código que faz o algoritmo de hash do SHA-1.

Segue o código comentado:

/* Implementação do algoritmo de encriptação com seus devidos direitos autorais:
 * 
 * Algoritmo  traduzido e comentado por mim:  STORM - boot.unknown@hotmail.com 
 * 
 * A Javascript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS PUB 180-1
 * Version 2.1 Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */

/*
 * Configuração das variáveis. Você pode necessitar para sem compátivel com o * usuário, 
 * mas o default (padrão) trabalha na maioria dos casos.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase		*/
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode	  */

/*
 * Estas são as funções que você geralmente requererá se chamar.
 */
function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}

/*
 * Um simples teste para ver se o VM [algoritmo sha-1] está trabalhando.
 */
function sha1_vm_test()
{
  return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}

/*
 * Calcular o SHA-1 de um array de palavras pequenas.
 */
function core_sha1(x, len)
{
  /* append padding */
  x[len >> 5] |= 0x80 << (24 - len % 32);
  x[((len + 64 >> 9) << 4) + 15] = len;

  var w = Array(80);
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;
  var e = -1009589776;

  for(var i = 0; i < x.length; i += 16)
  {
	var olda = a;
	var oldb = b;
	var oldc = c;
	var oldd = d;
	var olde = e;

	for(var j = 0; j < 80; j++)
	{
	  if(j < 16) w[j] = x[i + j];
	  else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
	  var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), 
					   safe_add(safe_add(e, w[j]), sha1_kt(j)));
	  e = d;
	  d = c;
	  c = rol(b, 30);
	  b = a;
	  a = t;
	}

	a = safe_add(a, olda);
	b = safe_add(b, oldb);
	c = safe_add(c, oldc);
	d = safe_add(d, oldd);
	e = safe_add(e, olde);
  }
  return Array(a, b, c, d, e);
  
}

/*
 * Executar a função apropriada da combinação para a interação atual.
 */
function sha1_ft(t, b, c, d)
{
  if(t < 20) return (b & c) | ((~b) & d);
  if(t < 40) return b ^ c ^ d;
  if(t < 60) return (b & c) | (b & d) | (c & d);
  return b ^ c ^ d;
}

/*
 * Determinar o aditivo (constantea) propriado  para a interação atual.
 */
function sha1_kt(t)
{
  return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
		 (t < 60) ? -1894007588 : -899497514;
}  

/*
 * Calcular o HMAC-SHA1, de uma chave e de alguns dados.
 */
function core_hmac_sha1(key, data)
{
  var bkey = str2binb(key);
  if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++) 
  {
	ipad[i] = bkey[i] ^ 0x36363636;
	opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
  return core_sha1(opad.concat(hash), 512 + 160);
}

/*
 * Adicionar os inteiros, envolvendo em 2^32. Isto usa 16-bit internamente 
 * para trabalhar em torno dos erros em intérpretes de algum JS.
 */
function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

/*
 * Rodar um numero de 32-bit para à esquerda.
 */
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * Converter   8-bit ou 16-bit string para um array de palavras
 *  8-bit função, characters (maior) >255 têm seu hi-byte ignorado.
 */
function str2binb(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
	bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
  return bin;
}

/*
 * Converte um array de palavras para uma string. 
 */
function binb2str(bin)
{
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
	str += String.fromCharCode((bin[i>>5] >>> (24 - i%32)) & mask);
  return str;
}

/*
 * Converte um array de palavras para uma string em hex.
 */
function binb2hex(binarray)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
	str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
		   hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
  }
  return str;
}

/*
 * Converte um array de palavras para uma string em base-64. 
 */
function binb2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
	var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
				| (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
				|  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
	for(var j = 0; j < 4; j++)
	{
	  if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
	  else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
	}
  }
  return str;
}

Enfim, fechando o ciclo chegamos a um conclusão,

Estes três algoritmos apresentados, md4,md5 e sha-1 , um evoluindo em cima
do outro, nos mostra como qualquer algoritmo de hash um dia será quebrado, e será impossível prever o contrário.

E o sha-1 assim como o md5 já pode ser 'quebrado' por comparação , sendo brute-force, ataque de dicionário, pode levar horas, dias, talvez anos.

Para isto possuí uma referência:

1 -

Quem tiver interesse, já fiz um encrypt on-line de md4|md5|sha-1 ;

encrypt on-line

Enfim, depois de tudo espero que tenha aberto a mente quanto a algumas coisas e tenha ajudado, na medida do possível.


STORM []'s
0

#2 Membro offline   Lucasbr Ícone

  • O.o
  • Ícone
  • Grupo: Administradores
  • Posts: 2441
  • Cadastrado: 03-julho 06
  • Localização:SBC - SP
  • Interesses:Meus interesses

Postou 02 dezembro 2006 - 05:20

Muito bom esse seu artigo Storm! Parabens!

Esses dias mesmo estava conversando com o adriano sobre isso.
Lucas Cavallari

Dúvidas? No fórum... nada de MP nem MSN...!
Se a resposta te ajudou, retorne ao topico e diga, pois facilitará para outros usuarios...
0

#3 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5473
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 04 dezembro 2006 - 09:04

Hà. Muito, muito bão storm.

E é bom ver isto aí em Javascript também hehehehe

Gostei do seu encriptador: a4e275c1e0f405074fc7a28be7fce1a50ad85378
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#4 Membro offline   Storm Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 23
  • Cadastrado: 21-agosto 06

Postou 04 dezembro 2006 - 10:50

Ver postMicox, em 04/12/2006 - 09:04, disse:

Hà. Muito, muito bão storm.

E é bom ver isto aí em Javascript também hehehehe

Gostei do seu encriptador: a4e275c1e0f405074fc7a28be7fce1a50ad85378


Fico feliz que tenha gostado, agora o negocio é fazer um hash próprio,

e dar a chave dele para o destinatário,

Aí sim estaria seguro contra intercepções no caminho.
0

#5 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5473
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 04 dezembro 2006 - 01:18

Uma dúvida que eu sempre tive com relação a esses esquema de hash cara:

- O hash geralmente tem menos caracteres que a string ou mais? ou não tem nada a ver?

E o hash dos arquivos que vc falou que é usado? é o mesmo esquema?
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#6 Membro offline   Storm Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 23
  • Cadastrado: 21-agosto 06

Postou 04 dezembro 2006 - 06:53

Ver postMicox, em 04/12/2006 - 13:18, disse:

Uma dúvida que eu sempre tive com relação a esses esquema de hash cara:

- O hash geralmente tem menos caracteres que a string ou mais? ou não tem nada a ver?

E o hash dos arquivos que vc falou que é usado? é o mesmo esquema?


Tipo, não entendi sua primeira pergunta,

O hash final seria a string , são os mesmos e o mecanismo (algoritmo) para gerar o resultado que seria ( a string encriptada) ou hash...

E o que eu disse, é criar seu próprio hash, padrão de como você vai encriptar algo e qual algoritmo usar.

Espero que tenha sanado as dúvidas.
0

#7 Membro offline   Prog Ícone

  • http://progrr.mybrute.com
  • Ícone
  • Grupo: Moderadores
  • Posts: 537
  • Cadastrado: 06-julho 06
  • Localização:Brasília/DF
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Postou 04 dezembro 2006 - 08:52

Ver postMicox, em 04/12/2006 - 13:18, disse:

- O hash geralmente tem menos caracteres que a string ou mais? ou não tem nada a ver?


Isto depende do algoritmo utilizado, os mais conhecidos são o MD5 e o SHA1. O MD5 sempre vai gerar uma string de 32 caracteres, independente do tamanho do arquivo ou do texto que você esta tirando o hash. A mesma regra vale para o algoritmo SHA-1, só que este gera uma sequência de 40 caracteres.

Por exemplo, para verificar a integridade de sistemas de arquivos do sistema, você pode usar um algoritmo de hash, para verificar se seu sistema ou arquivo foi modificado, criando algo como um log ou um banco de dados. Uma outra funcionalidade do hash muito utilizada é verificar a integridade de mensagens eletrônicas, por exemplo, vc envia um email e junto com ele o hash da sua mensagem, quando a pessoa recebe a mensagem, basta verificar o hash da mensagem, se não der a mesma sequência significa que a mensagem foi alterada.
------
Ps3 Player
Wii Player

Tutoriais Linux - http://forum.ievolution.com.br/index.php?showforum=157
0

#8 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5473
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 05 dezembro 2006 - 07:43

Hummm, entendi pessoal.
Valeu pelas respostas.
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

#9 Membro offline   Micox Ícone

  • Comunidade de desenvolvedores
  • Ícone
  • Grupo: Administradores
  • Posts: 5473
  • Cadastrado: 03-julho 06
  • Localização:Goiânia-GO
  • Interesses:Webly e elmicox.blogspot.com

Postou 18 abril 2007 - 09:17

Uma dúvida que surgiu agora devido a outra dúvida:
O sha-1 é criptografia só de ida ou tem volta?

//Se tiver volta, vou indicar na dúvida do cara lá.

--------
Edit:
Lendo este artigo aqui vi que, tanto o md5 quanto o sha-1 são algoritmos de hash e não tem chave, não tem volta.

O ideal então será indicar pro cara lá um algoritmo assimétrico.
Vou ver e acho alguma implementação do RSA ou DSA em javascript.

//Falei alguma bobeira. SE falei me ajuda aí e me corrige.
valeus.net/mwords - Links automáticos p/ o MercadoLivre em seu texto

Ajude, responda: mesmo que não saiba exatamente a resposta, seu pitaco pode dar uma luz no problema do outro.
Não respondo dúvidas por MP / Email / MSN e afins. O fórum está aqui pra isto.

elmicox.blogspot.com
0

Página 1 de 1


Resposta rápida

  

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)