Trabalhar com MD5

173 views
Skip to first unread message

Alexandre Carmo

unread,
Feb 25, 2014, 9:13:22 AM2/25/14
to nod...@googlegroups.com
Bom dia

Tenho uma tabela que armazena dados em um campo password, eu gostaria de armazenar o password usando a hash md5, porém pesquisando na net parece que tenho que instalar mais um mósulo para isso, se entendi corretamente. Porém minha estrutura uso os seguintes itens:

* Express
* Sequelize.

Então minha dúvida é usando o sequelize eu já consigo armazenar direto no banco usando o md5 e depois na consulta a mesma coisa, ou então o Express não faria a conversão para mim e depois eu só armazenava a informação em banco?

Por exemplo eu armazeno dessa forma:

PostHelpers.prototype.save_post = function() {
  var self = this;
  var data = {
    user_id   : this.user_id,
    password     : this.data.password,
    excerpt   : this.data.excerpt,
    copy      : this.data.copy,
    file_id   : this.data.file_id,
    fixed     : this.data.fixed,
    publish   : this.data.publish,
    fixed     : this.data.fixed,
    publish   : this.data.publish
  };
  this.Post.create(data).success(function(post) { self.res.json(post); });

eu quero converter usando md5 o campo password.

jeferson perito

unread,
Feb 25, 2014, 9:21:43 AM2/25/14
to nod...@googlegroups.com
Acho que tu pode usar a biblioteca nativa do node para criptografia
http://nodejs.org/api/crypto.html

OBS: Eu nao usaria o md5 para criptografia, ele é um algoritmo de hash...
Para um algoritmo de criptografia eu indico o blowfish. O modulo crypto suporta blowfish =D




--
Você está recebendo esta mensagem porque se inscreveu no grupo "Node.js Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para nodebr+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Atenciosamente,

Jeferson Viana Perito

Alan Hoffmeister

unread,
Feb 25, 2014, 9:21:56 AM2/25/14
to nod...@googlegroups.com
Não recomendo usar o md5 por ser "fácil" de quebrar, tente algo assim:
https://gist.github.com/anonymous/9209682
--
Att,
Alan Hoffmeister


Em 25 de fevereiro de 2014 11:13, Alexandre Carmo
<alex...@alexandreccarmo.com> escreveu:

Alan Hoffmeister

unread,
Feb 25, 2014, 9:22:47 AM2/25/14
to nod...@googlegroups.com
Também não recomendo encriptar a senha, e sim gerar um hash :)
--
Att,
Alan Hoffmeister


Em 25 de fevereiro de 2014 11:21, jeferson perito
<jefp...@gmail.com> escreveu:

jeferson perito

unread,
Feb 25, 2014, 9:42:03 AM2/25/14
to nod...@googlegroups.com
Verdade Alan,

entendi a pergunta errado, realmente para senha de úsuario o hash é o mais interessante

Diogo Duailibe

unread,
Feb 25, 2014, 9:43:22 AM2/25/14
to nod...@googlegroups.com
Atualmente utilizo o scrypt[0] para armazenar senhas no servidor. Ele é um pouco menos seguro que o blowfish, porém é mais rápido numa comparação entre senha e hash (pré-requisito pro nosso caso de uso*). Tem um artigo na wikipedia[1] que explica um pouco o algoritmo.

* Não tenho referências estatísticas oficiais para essa comparação. Utilizei o loader.io com os módulos bcrypt (blowfish) e scrypt (ambos com implementação em C++). Comparando a mesma senha com seus respectivos hash's, o scrypt obteve uma melhor resposta do que o bcrypt. Quanto maior fosse o número de requisições, o número de timeouts utilizando bcrypt era consideravelmente maior que o scrypt.

Diogo Duailibe da Silva
Técnico de Informática
Procuradoria da República no Maranhão - MPF
Email: diodu...@gmail.com

Augusto Pissarra

unread,
Feb 25, 2014, 10:14:09 AM2/25/14
to nod...@googlegroups.com
Estou usando hj o bcrypt-nodejs. Faz exatamente o que você precisa com toda a segurança.


Abs,


Augusto Bernardo
(55 11) 98851-6629
www.highdesign.com.br

email_hd


 


Gustavo Duarte

unread,
Feb 25, 2014, 10:27:25 AM2/25/14
to nod...@googlegroups.com
bcrypt é o que usamos também.

Filipe Deschamps

unread,
Feb 25, 2014, 9:13:08 PM2/25/14
to nod...@googlegroups.com
De acordo com o mestre Alan sobre o md5.

Agora sobre o Gist, tem que cuidar, pois o salt não pode ser fixo, ele precisa ser randômico e único para cada senha hasheada, certo?

Felipe Leusin

unread,
Feb 25, 2014, 10:43:09 PM2/25/14
to nod...@googlegroups.com
eu to usando atualmente http://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2_password_salt_iterations_keylen_callback


Mas honestamente contanto que utilize um hash + salt e que não seja MD5, já é meio caminho andado

Alexandre Carmo

unread,
Feb 26, 2014, 7:20:30 AM2/26/14
to nod...@googlegroups.com
Bom dia a todos.
Pessoal obrigado pela ajuda e explicações que vocês me passaram. Eu realmente iria usar md5, mas já esta fora de questão, andei lendo que vocês passaram e gostei da sugestão final do Felipe Leusin, olhei os links passados por ele mas ainda não entendi como eu usaria. entendi o conceito com o material que esta no link mas não entendi como usar.
Por exemplo tenho o form com o campo password, ele envia os dados para meu controller que vai armazenar no banco, então a rotina seria essa:
* Form de cadastro de usuários com campo password
* Informação enviada para o controller. Acredito que seria no controller que recebo a informação e uso o crypto para tratar o valor do password antes de armazenar no banco de dados.
* Na hora de acessar o sistema, usuário digita a senha para acessar o sistema precisa comparar a senha digitada com a que esta criptografada no banco.

Entendi que esses são passos mas não consegui aplicar a ideia, vocês poderiam me explicar.

Obrigado mais uma vez

principe...@gmail.com

unread,
Feb 26, 2014, 7:49:10 AM2/26/14
to nod...@googlegroups.com
eu uso no php o bcrypt que eh criptografia que utiliza um salt ramdomico. no js nao nada parecido nao?



--

Alexandre Carmo

unread,
Feb 26, 2014, 1:16:08 PM2/26/14
to nod...@googlegroups.com
Boa tarde pessoal, me confundi um pouco lendo a documentação:

Mas  agora já entendi, e consegui criar o hash, fiz da seguinte forma:

var teste = crypto.createHash('123teste').update('Apple').digest("hex");

Funcionou, armazeno o resultado em banco e quando o usuário entra com a senha dele faço o hash nela e comparo no banco de dados.
Porém ainda tenho uma dúvida se eu precisar pegar um valor que fiz o hash e esta no banco armazenado mas previso dele com engenharia reversa (não sei se essa é a forma certa), por exemplo o teste acima seria:
f223faa96f22916294922b171a2696d868fd1f9129302eb41a45b2a2ea2ebbfd
como converto isso novamente para "123teste"?

Alan Hoffmeister

unread,
Feb 26, 2014, 1:19:36 PM2/26/14
to nod...@googlegroups.com
Hash é uma função one-way, isso quer dizer que você não pode voltar ao
valor original, teoricamente não pode pelo menos.

Por que você precisaria da senha do usuário? :)
--
Att,
Alan Hoffmeister


Em 26 de fevereiro de 2014 15:16, Alexandre Carmo
<alex...@alexandreccarmo.com> escreveu:

Alexandre Carmo

unread,
Feb 26, 2014, 1:29:00 PM2/26/14
to nod...@googlegroups.com
Certo entendi.
Na verdade não preciso é só uma curiosidade se era possível. No caso do hash então já sei que não é possível porque não foi feito para isso
Mas por exemplo se eu precisar de cryptografar algo e depois retornar ao que era, existe algo para isso? 

Alan Hoffmeister

unread,
Feb 26, 2014, 1:32:10 PM2/26/14
to nod...@googlegroups.com
Existe, aí estamos falando sobre encriptação, aqui tem um exemplo
http://stackoverflow.com/questions/6953286/node-js-encrypting-data-that-needs-to-be-decrypted

Pelo bem da humanidade, não guarde senhas encriptadas no banco de
dados, e sim um hash forte delas.
--
Att,
Alan Hoffmeister


Em 26 de fevereiro de 2014 15:29, Alexandre Carmo
<alex...@alexandreccarmo.com> escreveu:

Alexandre Carmo

unread,
Feb 26, 2014, 1:48:10 PM2/26/14
to nod...@googlegroups.com
Obrigado Alan, valeu pela dica e o link e sim estou guardando hash.
Obrigado a todos pela ajuda

Ricardo Tomasi

unread,
Feb 26, 2014, 8:09:38 PM2/26/14
to nod...@googlegroups.com
Diogo, tu já deve saber disto, mas só pra complementar o tópico, o bcrypt é lento de propósito. O objetivo principal do bcrypt/scrypt/etc é impedir que os hashes sejam revertidos "à força", calculando todos os valores possíveis (rainbow table). Eles fazem isso tornando esse cálculo pesado demais para o hardware atual, e do futuro a curto/médio-prazo. Aqui tem uma comparação interessante do custo em hardware/US$ pra crackear uma senha com cada algoritmo: http://1.bp.blogspot.com/-orQpwmyYHTM/T2gG3HZwEPI/AAAAAAAAAf4/9qro2cgObzU/s1600/AoZCPIECQAI7gvp.png

O bcrypt, assim como PBKDF2, faz isso rodando o algoritmo múltiplas vezes[1] pra consumir CPU. Já o scrypt vai além exigindo uma quantidade maior de memória, que inviabiliza o uso de FPGA e hardware especializado, não dependendo tanto do processamento; por isso é mais rápido do que o bcrypt na configuração padrão.

Ou seja, num teste de carga o bcrypt vai esgotar os recursos de CPU do servidor antes do scrypt. Na prática essa diferença só vai se tornar relevante com um sistema de login utilizado em larga escala, já que ataques brute-force na web são facilmente bloqueados com rate-limiting e outras medidas simples. O importante é que qualquer um dos três (bcrypt/scrypt/pbkdf2) está bom, jamais md5/sha1!

Tem muita coisa interessante acontecendo nessa área por causa das cryptocurrencies (bitcoin/litecoin/etc), de quebra nosso sistemas vão ficando mais seguros. Enfim, me passei... boa noite :)

[1] 1024 por padrão, recomendado > 2^12 ou o equivalente a 200ms por senha em hardware de ponta

principe...@gmail.com

unread,
Feb 27, 2014, 6:19:39 AM2/27/14
to nod...@googlegroups.com
@ricardo, gostei de sua explicacao, eu nao sabia, eu utilizo o bcrypt em aplicacoes minhas usando php, e usarei o pbkdf2 no couchdb...

Alexandre Carmo

unread,
Feb 27, 2014, 8:31:03 AM2/27/14
to nod...@googlegroups.com
Bom dia
ótima explicação e interessante, notei que existe várias formas de usar o crypto, eu por exemplo usei:>
var teste = crypto.createHash('sha1').update('123teste').digest("hex"); 

sei que existe outras forma, essa por exemplo pbkdf2. Qual a diferença entre ela? e a forma de usar é a mesma? No caso do exemplo acima com eu usaria com pbkdf2?

Alan Hoffmeister

unread,
Feb 27, 2014, 8:35:54 AM2/27/14
to nod...@googlegroups.com
https://gist.github.com/cranic/f5585e0822cca0e64a10
--
Att,
Alan Hoffmeister


Em 27 de fevereiro de 2014 10:31, Alexandre Carmo
<alex...@alexandreccarmo.com> escreveu:
Reply all
Reply to author
Forward
0 new messages