Implementação MD5 mais rápida em JavaScript

236

Existem muitas implementações de JavaScript MD5 por aí. Alguém sabe qual é o mais avançado, mais corrigido e mais rápido?

Eu preciso disso para esta ferramenta.

powtac
fonte
2
Por que você precisa de uma implementação MD5 "rápida"?
31411 AnthonyWJones
3
@AnthonyWJones, é necessário outro tipo de função md5? Não é como se uma função md5 "lenta" realmente servisse a algum propósito ... funciona?
amigos estão dizendo sobre lucas olayvar
5
@LeeOlayvar Quanto mais lenta for uma função de criptografia, mais tempo levará para a força bruta de um determinado hash usando essa função.
Mathias Bynens
45
@MathiasBynens Sim, mas por design, o md5 é um hash rápido. Ou seja, ele foi projetado para consumir grandes quantidades de dados e gerar um hash muito, muito rápido. Essa é essencialmente a última coisa que você deseja armazenar dados seguros, como senhas / etc, e é mais adequada / projetada para identificar dados. Por outro lado, os hashes lentos são projetados para serem lentos desde o início. Forçar brutalmente um hash lento, com um grande valor de trabalho, não é uma tarefa fácil. Como tal, os hashes lentos são ideais para senhas. O MD5 é ruim para senhas em muitos casos (a maioria?). Eu não sou especialista neste campo, então leve isso com sal. :)
Lee Olayvar
16
Sim, mas como há uma especificação que determina a aparência de um hash MD5, não importa se você o calcula rápida ou lentamente. O resultado final é o mesmo e será igualmente difícil / fácil para a força bruta. Portanto, faz sentido usar a implementação mais rápida.
Stijn de Witt

Respostas:

168

Ouvi dizer que a implementação de Joseph's Myers é bastante rápida. Além disso, ele tem um longo artigo sobre otimização de Javascript que descreve o que aprendeu enquanto escrevia sua implementação. É uma boa leitura para qualquer pessoa interessada em javascript com desempenho.

http://www.webreference.com/programming/javascript/jkm3/

Sua implementação MD5 pode ser encontrada aqui

Matt Baker
fonte
123
"Para tornar meu código JavaScript MD5 mais rápido que o de todos os outros, tive que tirar proveito das variáveis ​​de função locais". Que avanço!
Glenn Maynard
11
Uma demonstração desta biblioteca md5 pode ser encontrada aqui: jsfiddle.net/v28gq
Anderson Verde
15
Qual é a licença para o código de Myers? Ele não indica que está licenciado (ou não) em seu site, tanto quanto eu posso dizer.
JeroenHoek
25
Incomoda-me que essa implementação crie um monte de funções globais, por isso encerrei tudo em um fechamento, tornei cada função uma variável e atribuí a função md5 ao objeto window. Obviamente, isso pressupõe que haja um objeto de janela, mas manterá todas as funções de suporte privadas. Não tenho certeza de como isso afetará o desempenho (se houver), mas deve ser muito mais seguro para uso em aplicativos grandes. gist.github.com/jhoff/7680711
jhoff 27/11
6
@jhoff Seu Gist foi bifurcado e melhorado algumas vezes, também acho que o var add32on-line 185 deveria ser add32o melhor para encontrar o melhor garfo possível e atualizei-o para esta nova versão: gist.github.com/MichaelPote/3f0cefaaa9578d7e30be
Mikepote
73

Eu sugiro que você use CryptoJS neste caso.

Basicamente, o CryptoJS é uma coleção crescente de algoritmos criptográficos padrão e seguros implementados em JavaScript usando as melhores práticas e padrões. Eles são rápidos e têm uma interface consistente e simples.

Portanto, se você deseja calcular o hash MD5 da sua string de senha, faça o seguinte:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/core.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/md5.js"></script>
<script>
    var passhash = CryptoJS.MD5(password).toString();

    $.post(
      'includes/login.php', 
      { user: username, pass: passhash },
      onLogin, 
      'json' );
</script>

Portanto, este script publicará o hash da sua string de senha no servidor.

Para mais informações e suporte sobre outros algoritmos de cálculo de hash, você pode visitar:

http://code.google.com/p/crypto-js/

theCodeMachine
fonte
59
Você não deve usar o md5 para senhas.
Lukas Liesis
3
Parece que isso ficará órfão em breve, ainda no "código do google". Ninguém está mantendo?
precisa saber é o seguinte
2
O md5 é rápido e se alguém quebrar seu site e seu db e código vazar, você sempre poderá gerar db com hashes e decodificar senhas. Dê-me seu banco de dados ao vivo com 10 milhões de usuários e código. Vou me divertir com isso e postar na internet meus resultados decodificados. Felicidades.
Lukas Liesis
2
O link leva a uma página 404 agora
Adam F
29

Ao selecionar a biblioteca, também é importante verificar se ele suporta estruturas modernas, como Bower, passa jslint, suporta modelo de plug-in para JQuery ou sistemas de módulos como AMD / RequireJS, além de estar em desenvolvimento ativo e ter mais de 1 colaboradores. Existem algumas opções que atendem a alguns ou a todos esses critérios adicionais:

  • CryptoJS : Essa é talvez a biblioteca mais abrangente em que cada algoritmo pode ser usado separadamente, sem adicionar gordura ao seu código JS. Além disso, como codificador / decodificador para UTF8, UTF16 e Base64. Eu mantenho o repositório do github registrado como pacote do Bower, além de instruções sobre como usá-lo com o RequireJS.
  • Spark MD5 : baseia-se no código JKM mencionado por outra resposta, que também é a implementação mais rápida. No entanto, além disso, a implementação do Spark adiciona suporte à AMD, passa jslint plus e tem modo incremental. Ele não possui Base64 o / p, mas possui o / p bruto (ou seja, matriz de 32 bits int insead da string).
  • Plugin JQuery MD5 : Muito simples, mas não parece ter o modo bruto.
  • JavaScript-MD5 : Não é tão chique ou rápido quanto o Spark, mas mais simples.

Exemplo do CryptoJS:

//just include md5.js from the CryptoJS rollups folder
var hash = CryptoJS.MD5("Message");
console.log(hash.toString()); 

Há uma comparação de desempenho entre as bibliotecas acima em http://jsperf.com/md5-shootout/7 . Em minha máquina, os testes atuais (que são reconhecidamente antigos) mostram que, se você procura velocidade, o Spark MD5 é sua melhor aposta (e também o código JKM comum). No entanto, se você procura uma biblioteca mais abrangente, o CryptoJS é sua melhor aposta, embora seja 79% mais lento que o Spark MD5. No entanto, eu imagino que o CryptoJS acabaria atingindo a mesma velocidade, pois é um projeto um pouco mais ativo.

Shital Shah
fonte
O link para "plugin jQuery MD5" leva-me a um site de malware. Eep!
Raffi
1
Parece que o site original do plugin jQuery MD5 foi encerrado e agora é redirecionado para o vendedor de domínio genérico. Atualizei para o plugin hospedado no GitHub agora.
Shital Shah
14

MD5 = function(e) {
    function h(a, b) {
        var c, d, e, f, g;
        e = a & 2147483648;
        f = b & 2147483648;
        c = a & 1073741824;
        d = b & 1073741824;
        g = (a & 1073741823) + (b & 1073741823);
        return c & d ? g ^ 2147483648 ^ e ^ f : c | d ? g & 1073741824 ? g ^ 3221225472 ^ e ^ f : g ^ 1073741824 ^ e ^ f : g ^ e ^ f
    }

    function k(a, b, c, d, e, f, g) {
        a = h(a, h(h(b & c | ~b & d, e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function l(a, b, c, d, e, f, g) {
        a = h(a, h(h(b & d | c & ~d, e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function m(a, b, d, c, e, f, g) {
        a = h(a, h(h(b ^ d ^ c, e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function n(a, b, d, c, e, f, g) {
        a = h(a, h(h(d ^ (b | ~c), e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function p(a) {
        var b = "",
            d = "",
            c;
        for (c = 0; 3 >= c; c++) d = a >>> 8 * c & 255, d = "0" + d.toString(16), b += d.substr(d.length - 2, 2);
        return b
    }
    var f = [],
        q, r, s, t, a, b, c, d;
    e = function(a) {
        a = a.replace(/\r\n/g, "\n");
        for (var b = "", d = 0; d < a.length; d++) {
            var c = a.charCodeAt(d);
            128 > c ? b += String.fromCharCode(c) : (127 < c && 2048 > c ? b += String.fromCharCode(c >> 6 | 192) : (b += String.fromCharCode(c >> 12 | 224), b += String.fromCharCode(c >> 6 & 63 | 128)), b += String.fromCharCode(c & 63 | 128))
        }
        return b
    }(e);
    f = function(b) {
        var a, c = b.length;
        a = c + 8;
        for (var d = 16 * ((a - a % 64) / 64 + 1), e = Array(d - 1), f = 0, g = 0; g < c;) a = (g - g % 4) / 4, f = g % 4 * 8, e[a] |= b.charCodeAt(g) << f, g++;
        a = (g - g % 4) / 4;
        e[a] |= 128 << g % 4 * 8;
        e[d - 2] = c << 3;
        e[d - 1] = c >>> 29;
        return e
    }(e);
    a = 1732584193;
    b = 4023233417;
    c = 2562383102;
    d = 271733878;
    for (e = 0; e < f.length; e += 16) q = a, r = b, s = c, t = d, a = k(a, b, c, d, f[e + 0], 7, 3614090360), d = k(d, a, b, c, f[e + 1], 12, 3905402710), c = k(c, d, a, b, f[e + 2], 17, 606105819), b = k(b, c, d, a, f[e + 3], 22, 3250441966), a = k(a, b, c, d, f[e + 4], 7, 4118548399), d = k(d, a, b, c, f[e + 5], 12, 1200080426), c = k(c, d, a, b, f[e + 6], 17, 2821735955), b = k(b, c, d, a, f[e + 7], 22, 4249261313), a = k(a, b, c, d, f[e + 8], 7, 1770035416), d = k(d, a, b, c, f[e + 9], 12, 2336552879), c = k(c, d, a, b, f[e + 10], 17, 4294925233), b = k(b, c, d, a, f[e + 11], 22, 2304563134), a = k(a, b, c, d, f[e + 12], 7, 1804603682), d = k(d, a, b, c, f[e + 13], 12, 4254626195), c = k(c, d, a, b, f[e + 14], 17, 2792965006), b = k(b, c, d, a, f[e + 15], 22, 1236535329), a = l(a, b, c, d, f[e + 1], 5, 4129170786), d = l(d, a, b, c, f[e + 6], 9, 3225465664), c = l(c, d, a, b, f[e + 11], 14, 643717713), b = l(b, c, d, a, f[e + 0], 20, 3921069994), a = l(a, b, c, d, f[e + 5], 5, 3593408605), d = l(d, a, b, c, f[e + 10], 9, 38016083), c = l(c, d, a, b, f[e + 15], 14, 3634488961), b = l(b, c, d, a, f[e + 4], 20, 3889429448), a = l(a, b, c, d, f[e + 9], 5, 568446438), d = l(d, a, b, c, f[e + 14], 9, 3275163606), c = l(c, d, a, b, f[e + 3], 14, 4107603335), b = l(b, c, d, a, f[e + 8], 20, 1163531501), a = l(a, b, c, d, f[e + 13], 5, 2850285829), d = l(d, a, b, c, f[e + 2], 9, 4243563512), c = l(c, d, a, b, f[e + 7], 14, 1735328473), b = l(b, c, d, a, f[e + 12], 20, 2368359562), a = m(a, b, c, d, f[e + 5], 4, 4294588738), d = m(d, a, b, c, f[e + 8], 11, 2272392833), c = m(c, d, a, b, f[e + 11], 16, 1839030562), b = m(b, c, d, a, f[e + 14], 23, 4259657740), a = m(a, b, c, d, f[e + 1], 4, 2763975236), d = m(d, a, b, c, f[e + 4], 11, 1272893353), c = m(c, d, a, b, f[e + 7], 16, 4139469664), b = m(b, c, d, a, f[e + 10], 23, 3200236656), a = m(a, b, c, d, f[e + 13], 4, 681279174), d = m(d, a, b, c, f[e + 0], 11, 3936430074), c = m(c, d, a, b, f[e + 3], 16, 3572445317), b = m(b, c, d, a, f[e + 6], 23, 76029189), a = m(a, b, c, d, f[e + 9], 4, 3654602809), d = m(d, a, b, c, f[e + 12], 11, 3873151461), c = m(c, d, a, b, f[e + 15], 16, 530742520), b = m(b, c, d, a, f[e + 2], 23, 3299628645), a = n(a, b, c, d, f[e + 0], 6, 4096336452), d = n(d, a, b, c, f[e + 7], 10, 1126891415), c = n(c, d, a, b, f[e + 14], 15, 2878612391), b = n(b, c, d, a, f[e + 5], 21, 4237533241), a = n(a, b, c, d, f[e + 12], 6, 1700485571), d = n(d, a, b, c, f[e + 3], 10, 2399980690), c = n(c, d, a, b, f[e + 10], 15, 4293915773), b = n(b, c, d, a, f[e + 1], 21, 2240044497), a = n(a, b, c, d, f[e + 8], 6, 1873313359), d = n(d, a, b, c, f[e + 15], 10, 4264355552), c = n(c, d, a, b, f[e + 6], 15, 2734768916), b = n(b, c, d, a, f[e + 13], 21, 1309151649), a = n(a, b, c, d, f[e + 4], 6, 4149444226), d = n(d, a, b, c, f[e + 11], 10, 3174756917), c = n(c, d, a, b, f[e + 2], 15, 718787259), b = n(b, c, d, a, f[e + 9], 21, 3951481745), a = h(a, q), b = h(b, r), c = h(c, s), d = h(d, t);
    return (p(a) + p(b) + p(c) + p(d)).toLowerCase()
};
<!DOCTYPE html>
<html>
<body onload="md5.value=MD5(a.value);">

<form oninput="md5.value=MD5(a.value)">Enter String:
<input type="string" id="a" name="a" value="https://www.zibri.org"></br></br>MD5:<output id="md5" name="md5" for="a"></output>
</form>

</body>
</html>

Zibri
fonte
mas parece que a implementação mais rápida é esta: myersdaily.org/joseph/javascript/jkm-md5.js
Zibri
este link não funciona myersdaily.org/joseph/javascript/jkm-md5.js
Giggs
@Giggs basta usar o google e você o encontrará: pajhome.org.uk/crypt/md5/contrib/jkm-md5.js
Zibri
11

Encontrei vários artigos sobre esse assunto. Todos eles sugeriram a implementação de Joseph Meyers.

consulte: http://jsperf.com/md5-shootout em alguns testes

em Minha busca pela velocidade máxima, olhei para esse código e vi que ele poderia ser melhorado. Então, eu criei um novo script JS baseado no código Joseph Meyers.

consulte Código de Jospeh Meyers aprimorado

ez2
fonte
11
por que bifurcar, em vez de apenas enviar seu patch de volta ao mantenedor?
Nick Jennings
5

Eu só preciso dar suporte a navegadores HTML5 que suportam matrizes digitadas (DataView, ArrayBuffer etc.). Acho que peguei o código Joseph Myers e o modifiquei para suportar a passagem em um Uint8Array. Não captei todas as melhorias e ainda existem provavelmente alguns artefatos de array char () que podem ser aprimorados. Eu precisava disso para adicionar ao projeto PouchDB.

var PouchUtils = {};
PouchUtils.Crypto = {};
(function () {
    PouchUtils.Crypto.MD5 = function (uint8Array) {
        function md5cycle(x, k) {
            var a = x[0], b = x[1], c = x[2], d = x[3];

            a = ff(a, b, c, d, k[0], 7, -680876936);
            d = ff(d, a, b, c, k[1], 12, -389564586);
            c = ff(c, d, a, b, k[2], 17, 606105819);
            b = ff(b, c, d, a, k[3], 22, -1044525330);
            a = ff(a, b, c, d, k[4], 7, -176418897);
            d = ff(d, a, b, c, k[5], 12, 1200080426);
            c = ff(c, d, a, b, k[6], 17, -1473231341);
            b = ff(b, c, d, a, k[7], 22, -45705983);
            a = ff(a, b, c, d, k[8], 7, 1770035416);
            d = ff(d, a, b, c, k[9], 12, -1958414417);
            c = ff(c, d, a, b, k[10], 17, -42063);
            b = ff(b, c, d, a, k[11], 22, -1990404162);
            a = ff(a, b, c, d, k[12], 7, 1804603682);
            d = ff(d, a, b, c, k[13], 12, -40341101);
            c = ff(c, d, a, b, k[14], 17, -1502002290);
            b = ff(b, c, d, a, k[15], 22, 1236535329);

            a = gg(a, b, c, d, k[1], 5, -165796510);
            d = gg(d, a, b, c, k[6], 9, -1069501632);
            c = gg(c, d, a, b, k[11], 14, 643717713);
            b = gg(b, c, d, a, k[0], 20, -373897302);
            a = gg(a, b, c, d, k[5], 5, -701558691);
            d = gg(d, a, b, c, k[10], 9, 38016083);
            c = gg(c, d, a, b, k[15], 14, -660478335);
            b = gg(b, c, d, a, k[4], 20, -405537848);
            a = gg(a, b, c, d, k[9], 5, 568446438);
            d = gg(d, a, b, c, k[14], 9, -1019803690);
            c = gg(c, d, a, b, k[3], 14, -187363961);
            b = gg(b, c, d, a, k[8], 20, 1163531501);
            a = gg(a, b, c, d, k[13], 5, -1444681467);
            d = gg(d, a, b, c, k[2], 9, -51403784);
            c = gg(c, d, a, b, k[7], 14, 1735328473);
            b = gg(b, c, d, a, k[12], 20, -1926607734);

            a = hh(a, b, c, d, k[5], 4, -378558);
            d = hh(d, a, b, c, k[8], 11, -2022574463);
            c = hh(c, d, a, b, k[11], 16, 1839030562);
            b = hh(b, c, d, a, k[14], 23, -35309556);
            a = hh(a, b, c, d, k[1], 4, -1530992060);
            d = hh(d, a, b, c, k[4], 11, 1272893353);
            c = hh(c, d, a, b, k[7], 16, -155497632);
            b = hh(b, c, d, a, k[10], 23, -1094730640);
            a = hh(a, b, c, d, k[13], 4, 681279174);
            d = hh(d, a, b, c, k[0], 11, -358537222);
            c = hh(c, d, a, b, k[3], 16, -722521979);
            b = hh(b, c, d, a, k[6], 23, 76029189);
            a = hh(a, b, c, d, k[9], 4, -640364487);
            d = hh(d, a, b, c, k[12], 11, -421815835);
            c = hh(c, d, a, b, k[15], 16, 530742520);
            b = hh(b, c, d, a, k[2], 23, -995338651);

            a = ii(a, b, c, d, k[0], 6, -198630844);
            d = ii(d, a, b, c, k[7], 10, 1126891415);
            c = ii(c, d, a, b, k[14], 15, -1416354905);
            b = ii(b, c, d, a, k[5], 21, -57434055);
            a = ii(a, b, c, d, k[12], 6, 1700485571);
            d = ii(d, a, b, c, k[3], 10, -1894986606);
            c = ii(c, d, a, b, k[10], 15, -1051523);
            b = ii(b, c, d, a, k[1], 21, -2054922799);
            a = ii(a, b, c, d, k[8], 6, 1873313359);
            d = ii(d, a, b, c, k[15], 10, -30611744);
            c = ii(c, d, a, b, k[6], 15, -1560198380);
            b = ii(b, c, d, a, k[13], 21, 1309151649);
            a = ii(a, b, c, d, k[4], 6, -145523070);
            d = ii(d, a, b, c, k[11], 10, -1120210379);
            c = ii(c, d, a, b, k[2], 15, 718787259);
            b = ii(b, c, d, a, k[9], 21, -343485551);

            x[0] = add32(a, x[0]);
            x[1] = add32(b, x[1]);
            x[2] = add32(c, x[2]);
            x[3] = add32(d, x[3]);

        }

        function cmn(q, a, b, x, s, t) {
            a = add32(add32(a, q), add32(x, t));
            return add32((a << s) | (a >>> (32 - s)), b);
        }

        function ff(a, b, c, d, x, s, t) {
            return cmn((b & c) | ((~b) & d), a, b, x, s, t);
        }

        function gg(a, b, c, d, x, s, t) {
            return cmn((b & d) | (c & (~d)), a, b, x, s, t);
        }

        function hh(a, b, c, d, x, s, t) {
            return cmn(b ^ c ^ d, a, b, x, s, t);
        }

        function ii(a, b, c, d, x, s, t) {
            return cmn(c ^ (b | (~d)), a, b, x, s, t);
        }

        function md51(s) {
            txt = '';
            var n = s.length,
            state = [1732584193, -271733879, -1732584194, 271733878], i;
            for (i = 64; i <= s.length; i += 64) {
                md5cycle(state, md5blk(s.subarray(i - 64, i)));
            }
            s = s.subarray(i - 64);
            var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
            for (i = 0; i < s.length; i++)
                tail[i >> 2] |= s[i] << ((i % 4) << 3);
            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
            if (i > 55) {
                md5cycle(state, tail);
                for (i = 0; i < 16; i++) tail[i] = 0;
            }
            tail[14] = n * 8;
            md5cycle(state, tail);
            return state;
        }

        /* there needs to be support for Unicode here,
         * unless we pretend that we can redefine the MD-5
         * algorithm for multi-byte characters (perhaps
         * by adding every four 16-bit characters and
         * shortening the sum to 32 bits). Otherwise
         * I suggest performing MD-5 as if every character
         * was two bytes--e.g., 0040 0025 = @%--but then
         * how will an ordinary MD-5 sum be matched?
         * There is no way to standardize text to something
         * like UTF-8 before transformation; speed cost is
         * utterly prohibitive. The JavaScript standard
         * itself needs to look at this: it should start
         * providing access to strings as preformed UTF-8
         * 8-bit unsigned value arrays.
         */
        function md5blk(s) { /* I figured global was faster.   */
            var md5blks = [], i; /* Andy King said do it this way. */
            for (i = 0; i < 64; i += 4) {
                md5blks[i >> 2] = s[i]
                + (s[i + 1] << 8)
                + (s[i + 2] << 16)
                + (s[i + 3] << 24);
            }
            return md5blks;
        }

        var hex_chr = '0123456789abcdef'.split('');

        function rhex(n) {
            var s = '', j = 0;
            for (; j < 4; j++)
                s += hex_chr[(n >> (j * 8 + 4)) & 0x0F]
                + hex_chr[(n >> (j * 8)) & 0x0F];
            return s;
        }

        function hex(x) {
            for (var i = 0; i < x.length; i++)
                x[i] = rhex(x[i]);
            return x.join('');
        }

        function md5(s) {
            return hex(md51(s));
        }

        function add32(a, b) {
            return (a + b) & 0xFFFFFFFF;
        }

        return md5(uint8Array);
    };
})();
Dr.YSG
fonte
1
Estou interessado no desempenho total do sistema. Portanto, minha demonstração inclui downloads xhr2 e lojas PouchDB (IDB). Você pode experimentá-lo e ver os resultados de desempenho em codepen.io/DrYSG/pen/kdzft . O que eu gostaria de um algoritmo MD5 pessoa a olhar é o add32 () e md5blks () funções e ver se eles não pode ser acelerado por binário digitado matrizes Uint32Array ()
Dr.YSG
1
O txt = ''que realmente significa?
Makarov Sergey
5

Escrevi testes para comparar várias implementações de hash JavaScript, incluindo a maioria das implementações MD5 mencionadas aqui. Para executar os testes, acesse http://brillout.github.io/test-javascript-hash-implementations/ e aguarde um pouco.

Parece que a implementação do YaMD5 da resposta de R. Hill é a mais rápida.

brillout
fonte
Obrigado pela excelente referência !! O YaMD5 com caracteres largos parece lento, por isso vou usar o FastMD5 para uso genérico.
Alfonso Nishikawa
4

Incomodou-me o fato de não conseguir encontrar uma implementação que seja rápida e que suporte seqüências de caracteres Unicode.

Por isso, criei um que suporta seqüências de caracteres Unicode e ainda é mais rápido (no momento da escrita) do que as implementações atualmente mais rápidas atualmente:

https://github.com/gorhill/yamd5.js

Baseado no código de Joseph Myers, mas usa TypedArrays, além de outras melhorias.

R. Hill
fonte
Parabéns a você. Este é realmente o único até agora encontrado que produz exatamente o mesmo hash que o utilitário md5 em um servidor Unix. Bem feito, de fato.
Jacques
4

Apenas por diversão,

este tem 42 linhas, cabe 120 caracteres horizontalmente e fica bem. É rápido? Bem - é rápido o suficiente e é aproximadamente o mesmo que todas as outras implementações de JS.

Eu só queria algo que não parecesse feio no meu arquivo helpers.js e não diminuísse o meu SublimeText com apenas uma linha de 20 milhas.

Então aqui está o meu MD5 favorito.

//  A formatted version of a popular md5 implementation.
//  Original copyright (c) Paul Johnston & Greg Holt.
//  The function itself is now 42 lines long.

function md5(inputString) {
    var hc="0123456789abcdef";
    function rh(n) {var j,s="";for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
    function ad(x,y) {var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
    function rl(n,c)            {return (n<<c)|(n>>>(32-c));}
    function cm(q,a,b,x,s,t)    {return ad(rl(ad(ad(a,q),ad(x,t)),s),b);}
    function ff(a,b,c,d,x,s,t)  {return cm((b&c)|((~b)&d),a,b,x,s,t);}
    function gg(a,b,c,d,x,s,t)  {return cm((b&d)|(c&(~d)),a,b,x,s,t);}
    function hh(a,b,c,d,x,s,t)  {return cm(b^c^d,a,b,x,s,t);}
    function ii(a,b,c,d,x,s,t)  {return cm(c^(b|(~d)),a,b,x,s,t);}
    function sb(x) {
        var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for(i=0;i<nblk*16;i++) blks[i]=0;
        for(i=0;i<x.length;i++) blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);
        blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
    }
    var i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
    for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
        a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17,  606105819);
        b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
        c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22,  -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
        d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17,     -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
        a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12,  -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
        b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
        c=gg(c,d,a,b,x[i+11],14,  643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
        d=gg(d,a,b,c,x[i+10], 9,   38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
        a=gg(a,b,c,d,x[i+ 9], 5,  568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
        b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9,  -51403784);
        c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4,    -378558);
        d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23,  -35309556);
        a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
        b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4,  681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
        c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23,   76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
        d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16,  530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
        a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
        b=ii(b,c,d,a,x[i+ 5],21,  -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
        c=ii(c,d,a,b,x[i+10],15,   -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
        d=ii(d,a,b,c,x[i+15],10,  -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
        a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15,  718787259);
        b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
    }
    return rh(a)+rh(b)+rh(c)+rh(d);
}

Mas, na verdade, eu o postei apenas por considerações estéticas. Além disso, nos comentários, são exatamente 4000 bytes. Por favor, não pergunte o porquê. Não consigo encontrar uma explicação adequada para o meu comportamento de TOC / rebelde. Além disso, obrigado Paul Johnston, obrigado Greg Holt. (Nota: vocês omitiram algumas palavras-chave var, então tomei a liberdade de adicioná-las.)

dkellner
fonte
@dkelner Cool. Gostaria de copiar / colar sua função para usar no meu aplicativo. Por favor, você poderia conceder uma licença
pinoyyid 20/06
Não há necessidade, é absolutamente gratuito, é um trabalho derivado de outra implementação gratuita. Então, basta usá-lo e talvez comentar os autores como eu fiz.
dkellner 20/06
3

O Node.js possui suporte interno

const crypto = require('crypto')
crypto.createHash('md5').update('hello world').digest('hex')

O trecho de código acima calcula a sequência hexadecimal MD5 para a sequência hello world

A vantagem desta solução é que você não precisa instalar uma biblioteca adicional.

Eu acho que a solução integrada deve ser a mais rápida. Caso contrário, devemos criar issue / PR para o projeto Node.js.

Tyler Long
fonte
1

js-md5 suporta UTF-8 string, array, ArrayBuffer, AMD ....

e rápido. jsperf

emn178
fonte
1

Talvez este pacote tenha sido útil
https://www.npmjs.com/package/pure-md5

console.time('latin');
const latin = md5('hello');
console.timeEnd('latin');

console.log('Привет: ', md5('Привет'));
console.log('嘿: ', md5('嘿'));
<script src="https://unpkg.com/pure-md5@latest/lib/index.js"></script>

eustatos
fonte
0

Por que não tentar http://phpjs.org/functions/md5/ ?

Infelizmente, o desempenho é limitado com qualquer script emulado, no entanto, isso pode render um hash md5 real. Embora eu recomendaria não usar o md5 para senhas, pois é um hash de renderização rápida.

Francis
fonte
-3

Você também pode verificar a minha implementação MD5 . Deve ser aprox. o mesmo que o outro postado acima. Infelizmente, o desempenho é limitado pelo loop interno, que é impossível de otimizar mais.


fonte
-4

Se o desempenho do seu aplicativo é limitado por uma implementação Javascript do MD5, você está realmente fazendo algo errado. Considere uma alteração na arquitetura (Dica: use MD5 com menos frequência)

MarkR
fonte
3
Im que não usam MD5 em um aplicativo "nativo" com JS, é uma ferramenta de verificação de MD5 on-line: bruechner.de/md5file/js há necessidade de aplicativo nativo para MD5 mais;)
powtac