Gere o mesmo MD5 usando javascript e PHP
Eu estou tentando construir um aplicativo que precisa comparar o hash MD5 de qualquer arquivo. Devido a problemas específicos, antes do upload, o MD5 deve ser gerado no lado do cliente e, após o upload, o aplicativo precisa verificar o lado do servidor.
Minha primeira abordagem foi usar, no lado do cliente, a API de arquivo JavaScript eFileReader.ReadAs
funções. Então eu uso o algoritmo MD5 encontrado aqui:http://pajhome.org.uk/crypt/md5/
Lado do servidor, eu usaria PHP'sfopen
comando e omd5
função.
Essa abordagem funciona bem ao usar arquivos de texto simples. Mas, quando um arquivo binário é usado (como alguns jpg ou pdf), o MD5 gerado no lado do cliente é diferente do servidor. Usandomd5sum
ferramenta de linha de comando Eu descobri que o servidor MD5 está correto e o problema ocorre no lado do cliente.
Eu tentei outra API MD5 que encontrei com os mesmos resultados. Eu suspeito queFileReader.ReadAs
funções estão carregando o conteúdo do arquivo de forma ligeiramente diferente (tenteiReadAs
variantes de função: texto, binário e assim por diante), mas não consigo descobrir qual é a diferença.
Eu estou faltando alguma coisa, mas não sei o que, talvez eu precise decodificar o conteúdo de alguma forma antes de gerar o MD5.
Alguma dica?
Editar 1:
Eu segui a ideia dada por optima1. Tomou cada personagem e imprimiu o número unicode tanto em javascript quanto em PHP. Eu podia ver apenas uma diferença no final em todos os casos (usado vimdiff).
PHP: 54 51 10 37 37 69 79 70 0
Javascript: 54 51 10 37 37 69 79 70
Talvez este zero extra no PHP seja algum tipo de "string end". Em ambos os casos, as cadeias binárias têm o mesmo tamanho. Adicionar um String.fromCharCode (0) ao final do conteúdo JS não resolve o problema. Eu continuarei investigando.
Se eu não conseguir encontrar uma solução, tentarei construir uma string gigante, concatenando esses códigos de caracteres e usando-os para construir o MD5. É uma solução de porcaria, mas servirá por agora e só preciso adicionar um zero ao final da string JS ...
Editar 2:
Graças a Deus! Esta implementação funciona como um encanto:http://www.myersdaily.org/joseph/javascript/md5.js
Se você precisa gerar um hash MD5 a partir de arquivos binários, vá em frente.
Desde já, obrigado!