Implementasi MD5 tercepat dalam JavaScript


236

Ada banyak implementasi JavaScript MD5 di luar sana. Apakah ada yang tahu yang mana yang paling canggih, paling diperbaiki bug dan tercepat?

Saya membutuhkannya untuk alat ini .


2
Mengapa Anda membutuhkan implementasi MD5 "cepat"?
AnthonyWJones

3
@AnthonyWJones apakah ada kebutuhan untuk jenis fungsi md5 lainnya? Ini tidak seperti fungsi "lambat" md5 benar-benar melayani tujuan apa pun .. bukan?
Lee Olayvar

5
@LeeOlayvar Semakin lambat fungsi kriptografi, semakin lama waktu yang diperlukan untuk menguatkan hash yang diberikan menggunakan fungsi itu.
Mathias Bynens

45
@MathiasBynens Ya tapi menurut desain, md5 adalah hash yang cepat. Dengan kata lain, ini dirancang untuk mengkonsumsi sejumlah besar data dan menghasilkan hash dengan sangat, sangat cepat. Ini pada dasarnya adalah hal terakhir yang Anda inginkan untuk menyimpan data aman seperti kata sandi / etc, dan lebih cocok / dirancang untuk mengidentifikasi data. Hash lambat di sisi lain, dirancang untuk menjadi lambat dari bawah ke atas. Brute memaksa hash lambat, dengan nilai kerja yang besar, bukanlah tugas yang mudah. Dengan demikian, hash lambat ideal untuk kata sandi. MD5 buruk untuk kata sandi dalam banyak (kebanyakan?) Kasus. Saya bukan ahli dalam bidang ini, jadi ambil ini dengan garam. :)
Lee Olayvar

16
Ya, tetapi karena ada spesifikasi yang mengamanatkan seperti apa hash MD5, tidak masalah apakah Anda menghitungnya dengan cepat atau lambat. Hasil akhirnya adalah sama dan akan sama sulit / gampang untuk bruteforce. Jadi tidak masuk akal untuk menggunakan implementasi tercepat.
Stijn de Witt

Jawaban:


168

Saya pernah mendengar implementasi Myers dari Joseph cukup cepat. Selain itu, ia memiliki artikel panjang tentang optimasi Javascript yang menjelaskan apa yang ia pelajari saat menulis implementasinya. Ini bacaan yang bagus untuk siapa saja yang tertarik dengan performansi javascript.

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

Implementasi MD5-nya dapat ditemukan di sini


123
"Untuk membuat kode JavaScript MD5 saya lebih cepat daripada yang lainnya, saya harus memanfaatkan variabel fungsi lokal." Terobosan yang luar biasa!
Glenn Maynard


15
Apa lisensi untuk kode Myers? Dia tidak menunjukkan bahwa itu dilisensikan (atau tidak) di situsnya sejauh yang saya tahu.
JeroenHoek

25
Itu mengganggu saya bahwa implementasi ini menciptakan banyak fungsi global, jadi saya membungkus semuanya dalam sebuah penutupan, membuat masing-masing fungsi menjadi variabel dan menetapkan fungsi md5 ke objek jendela. Ini jelas mengasumsikan ada objek jendela, tetapi itu akan menjaga semua fungsi pendukung tetap pribadi. Saya tidak yakin bagaimana (jika sama sekali) ini akan mempengaruhi kinerja, tetapi harus jauh lebih aman untuk digunakan dalam aplikasi besar. gist.github.com/jhoff/7680711
jhoff

6
@jhoff Gist Anda telah dipalsukan dan ditingkatkan beberapa kali, saya juga berpikir bahwa var add32pada saluran 185 seharusnya hanya add32jadi saya menemukan garpu terbaik yang saya bisa dan memperbaruinya ke versi baru ini: gist.github.com/MichaelPote/3f0cefaaa9578d7e30be
Mikepote

73

Saya sarankan Anda menggunakan CryptoJS dalam kasus ini.

Pada dasarnya CryptoJS adalah kumpulan algoritma kriptografi standar dan aman yang berkembang yang diimplementasikan dalam JavaScript menggunakan praktik dan pola terbaik. Mereka cepat, dan mereka memiliki antarmuka yang konsisten dan sederhana.

Jadi jika Anda ingin menghitung hash MD5 dari kata sandi Anda, maka lakukan sebagai berikut:

<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>

Jadi skrip ini akan memposting hash dari kata sandi Anda ke server.

Untuk info lebih lanjut dan dukungan tentang algoritma penghitungan hash lainnya, Anda dapat mengunjungi:

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


59
Anda seharusnya tidak menggunakan md5 untuk kata sandi.
Lukas Liesis

3
Sepertinya ini akan menjadi yatim piatu tak lama, masih di "kode google". Tidak ada yang memelihara?
MrYellow

2
md5 cepat dan jika seseorang meretas situs Anda dan db & kode Anda bocor, Anda selalu dapat menghasilkan db dengan hash dan decode kata sandi. Berikan saya basis data langsung Anda dengan 10 juta pengguna & kode. Saya akan bersenang-senang dengan itu dan memposting di internet hasil dekode saya. Bersulang.
Lukas Liesis

2
Tautan mengarah ke Halaman 404 sekarang
Adam F


29

Sementara memilih pustaka juga penting untuk melihat apakah ia mendukung kerangka kerja modern seperti Bower, melewati jslint, mendukung model plugin untuk JQuery atau sistem modul seperti AMD / RequireJS selain berada dalam pengembangan aktif dan memiliki lebih dari 1 kontributor. Ada beberapa opsi yang memenuhi beberapa atau semua kriteria tambahan ini:

  • CryptoJS : Ini mungkin perpustakaan paling luas di mana setiap algoritma dapat digunakan secara terpisah tanpa menambahkan lemak ke kode JS Anda. Ditambah itu sebagai encoder / decoder untuk UTF8, UTF16 dan Base64. Saya mengelola repositori github yang terdaftar sebagai paket Bower plus instruksi tentang cara menggunakannya dengan RequireJS.
  • Spark MD5 : Ini didasarkan pada kode JKM yang jawaban lain menyebutkan yang juga implementasi lebih cepat. Namun di samping itu, implementasi Spark menambahkan dukungan AMD, melewati jslint plus memiliki mode tambahan. Itu tidak memiliki Base64 o / p tetapi memiliki o / p mentah (yaitu array insead string 32-bit).
  • Plugin JQuery MD5 : Sangat sederhana ke bumi tetapi tampaknya tidak memiliki mode mentah.
  • JavaScript-MD5 : Tidak semewah atau secepat Spark tetapi lebih sederhana.

Contoh dari CryptoJS:

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

Ada perbandingan kinerja antara perpustakaan di atas di http://jsperf.com/md5-shootout/7 . Di mesin saya tes saat ini (yang memang sudah tua) menunjukkan bahwa jika Anda mencari kecepatan MD5 Spark adalah taruhan terbaik Anda (dan begitu juga kode JKM biasa). Namun jika Anda mencari perpustakaan yang lebih komprehensif maka CryptoJS adalah taruhan terbaik Anda meskipun 79% lebih lambat dari Spark MD5. Namun saya akan membayangkan CryptoJS akhirnya akan mencapai kecepatan yang sama karena ini adalah proyek yang sedikit lebih aktif.


Tautan ke "plugin jQuery MD5" membawa saya ke situs malware. Eep!
Raffi

1
Sepertinya situs web asli untuk plugin jQuery MD5 ditutup dan sekarang dialihkan ke penjual domain umum. Saya telah memperbarui plugin yang diinangi di GitHub sekarang.
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>


tetapi tampaknya implementasi tercepat adalah yang ini: myersdaily.org/joseph/javascript/jkm-md5.js
Zibri

tautan ini tidak berfungsi myersdaily.org/joseph/javascript/jkm-md5.js
Giggs

@Giggs cukup gunakan google dan Anda akan menemukannya: pajhome.org.uk/crypt/md5/contrib/jkm-md5.js
Zibri

11

Saya menemukan sejumlah artikel tentang hal ini. Mereka semua menyarankan penerapan Joseph Meyers.

lihat: http://jsperf.com/md5-shootout pada beberapa tes

dalam pencarian saya untuk kecepatan tertinggi saya melihat kode ini, dan saya melihat bahwa itu dapat ditingkatkan. Jadi saya membuat skrip JS baru berdasarkan kode Joseph Meyers.

lihat kode Jospeh Meyers yang disempurnakan


11
mengapa bercabang, alih-alih hanya mengirimkan patch Anda kembali ke pengelola?
Nick Jennings


5

Saya hanya perlu mendukung browser HTML5 yang mendukung array yang diketik (DataView, ArrayBuffer, dll.) Saya pikir saya mengambil kode Joseph Myers dan memodifikasinya untuk mendukung passing dalam Uint8Array. Saya tidak menangkap semua peningkatan, dan mungkin masih ada beberapa artefak array char () yang dapat ditingkatkan. Saya membutuhkan ini untuk menambah proyek 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);
    };
})();

1
Saya tertarik dengan kinerja sistem total, Jadi demo saya mencakup unduhan xhr2 dan toko PouchDB (IDB). Anda dapat mencobanya dan melihat hasil kinerja di codepen.io/DrYSG/pen/kdzft . Apa yang saya ingin orang algoritma MD5 untuk melihat adalah fungsi add32 () dan md5blks () dan melihat apakah mereka tidak dapat dipercepat oleh array diketik biner Uint32Array ()
Dr.YSG

1
Apa yang txt = ''sebenarnya dimaksud?
Makarov Sergey

5

Saya menulis tes untuk membandingkan beberapa implementasi hash JavaScript, termasuk sebagian besar implementasi MD5 yang disebutkan di sini. Untuk menjalankan tes, buka http://brillout.github.io/test-javascript-hash-implementations/ dan tunggu sebentar.

Tampaknya implementasi YaMD5 dari jawaban R. Hill adalah yang tercepat.


Terima kasih atas tolok ukurnya !! YaMD5 dengan karakter lebar sepertinya lambat, jadi saya akan tetap menggunakan FastMD5 untuk penggunaan umum.
Alfonso Nishikawa

4

Itu mengganggu saya bahwa saya tidak dapat menemukan implementasi yang cepat dan mendukung string Unicode.

Jadi saya membuat satu yang mendukung string Unicode dan masih menunjukkan lebih cepat (pada saat penulisan) daripada implementasi ascii-only-strings tercepat saat ini:

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

Berdasarkan kode Joseph Myers, tetapi menggunakan TypedArrays, plus peningkatan lainnya.


Kudos untuk Anda. Ini sebenarnya satu-satunya sejauh ini yang saya temukan yang menghasilkan hash yang sama persis dengan utilitas MD5 pada server Unix. Memang dilakukan dengan baik.
Jacques

4

Hanya untuk bersenang-senang,

yang ini panjangnya 42 baris, pas dalam 120 karakter secara horizontal, dan terlihat bagus. Apakah ini cepat? Yah - ini cukup cepat dan kira-kira sama dengan semua implementasi JS lainnya.

Saya hanya menginginkan sesuatu yang tidak terlihat jelek di file helpers.js saya dan tidak memperlambat SublimeText saya dengan min-liner sepanjang 20 mil yang diperkecil.

Jadi inilah md5 favorit saya.

//  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);
}

Tapi sungguh, saya mempostingnya hanya karena pertimbangan estetika. Juga, dengan komentar itu persis 4000 byte. Tolong jangan tanya kenapa. Saya tidak dapat memberikan penjelasan yang tepat untuk perilaku OCD / pemberontak saya. Juga, terima kasih Paul Johnston, terima kasih Greg Holt. (Catatan: kalian menghilangkan beberapa kata kunci var jadi saya mengambil kebebasan untuk menambahkannya.)


@dkelner Keren. Saya ingin menyalin / menempelkan fungsi Anda untuk digunakan di aplikasi saya. Tolong bisakah Anda memberikan lisensi
pinoyyid

Tidak perlu, ini benar-benar gratis untuk digunakan, ini adalah karya turunan dari implementasi gratis lainnya. Jadi gunakan saja dan mungkin komentar penulis seperti yang saya lakukan.
dkellner

3

Node.js memiliki dukungan bawaan

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

Cuplikan kode di atas menghitung string hex MD5 untuk string hello world

Keuntungan dari solusi ini adalah Anda tidak perlu menginstal perpustakaan tambahan.

Saya pikir solusi bawaan harus menjadi yang tercepat. Jika tidak, kita harus membuat masalah / PR untuk proyek Node.js.



1

Mungkin paket ini bermanfaat
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>


0

Mengapa tidak mencoba http://phpjs.org/functions/md5/ ?

Sayangnya kinerjanya terbatas dengan skrip yang diemulasikan, namun ini dapat membuat hash md5 nyata. Meskipun saya akan menyarankan untuk tidak menggunakan md5 untuk kata sandi, karena ini adalah hash yang diberikan dengan cepat.



-3

Anda juga dapat memeriksa implementasi md5 saya . Itu harus sekitar. sama dengan yang lain diposting di atas. Sayangnya, kinerja dibatasi oleh loop dalam yang tidak mungkin untuk mengoptimalkan lebih banyak.


-4

Jika kinerja aplikasi Anda dibatasi oleh implementasi Javascript MD5, maka Anda benar-benar melakukan kesalahan. Pertimbangkan perubahan arsitektur (Petunjuk: gunakan MD5 lebih jarang)


3
Saya tidak menggunakan MD5 dalam aplikasi "asli" dengan JS, ini merupakan alat periksa MD5 online: bruechner.de/md5file/js tidak perlu lagi aplikasi asli untuk MD5;)
powtac
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.