Apakah menghitung hash MD5 kurang intensif CPU daripada fungsi keluarga SHA?

115

Apakah menghitung hash MD5 kurang intensif CPU daripada SHA-1 atau SHA-2 pada perangkat keras laptop x86 "standar"? Saya tertarik pada informasi umum, tidak khusus untuk chip tertentu.

UPDATE: Dalam kasus saya, saya tertarik untuk menghitung hash file. Jika ukuran file penting, anggap saja 300K.

Mick
sumber
Itu bukan jawaban untuk pertanyaan Anda, tetapi pendukung Skein mengedepankan kecepatannya, dan itu pasti tidak lebih lemah dari akhir masa pakai MD5 saat ini. Dalam pesan yang harus Anda hash sangat pendek, kecepatan bisa menjadi kerugian untuk fungsi hash kriptografi sekalipun (khususnya, seberapa cepat orang lain dapat mengimplementasikannya, bukan seberapa cepat itu berjalan di laptop Anda). schneier.com/skein1.2.pdf
Pascal Cuoq
4
@Pascal: Skein bukanlah yang tercepat dari kandidat SHA-3, terutama pada platform 32-bit. Pada 64-bit x86, Skein mencapai sekitar 300 MB / s (Skein-512 lebih cepat dari Skein-256), yang sebanding dengan SHA-1, tetapi dalam mode 32-bit, kinerja turun menjadi kurang dari 60 MB / s, dua kali lebih lambat dari SHA-256. Di sisi lain, SHABAL, kandidat SHA-3 lainnya, menawarkan kinerja yang mirip dengan SHA-1 pada platform 32-bit dan 64-bit.
Thomas Pornin

Jawaban:

123

Ya, MD5 agak kurang intensif CPU. Di Intel x86 saya (Core2 Quad Q6600, 2,4 GHz, menggunakan satu inti), saya mendapatkan ini dalam mode 32-bit:

MD5       411
SHA-1     218
SHA-256   118
SHA-512    46

dan ini dalam mode 64-bit:

MD5       407
SHA-1     312
SHA-256   148
SHA-512   189

Angka dalam megabyte per detik, untuk pesan "panjang" (inilah yang Anda dapatkan untuk pesan yang lebih panjang dari 8 kB). Ini dengan sphlib , perpustakaan implementasi fungsi hash di C (dan Java). Semua penerapan berasal dari penulis yang sama (saya) dan dilakukan dengan upaya pengoptimalan yang sebanding; dengan demikian perbedaan kecepatan dapat dianggap benar-benar intrinsik dengan fungsi tersebut.

Sebagai perbandingan, pertimbangkan bahwa hard disk baru-baru ini akan berjalan pada kecepatan sekitar 100 MB / dtk, dan apa pun melalui USB akan mencapai di bawah 60 MB / dtk. Meskipun SHA-256 tampak "lambat" di sini, ini cukup cepat untuk sebagian besar tujuan.

Perhatikan bahwa OpenSSL menyertakan implementasi SHA-512 32-bit yang cukup lebih cepat dari kode saya (tetapi tidak secepat SHA-512 64-bit), karena implementasi OpenSSL sedang dalam perakitan dan menggunakan register SSE2, sesuatu yang tidak dapat dilakukan dalam C. SHA-512 adalah satu-satunya fungsi di antara empat yang mendapat manfaat dari implementasi SSE2.

Sunting: di halaman ini ( arsip ), orang dapat menemukan laporan kecepatan banyak fungsi hash (klik pada link "Telechargez maintenant"). Laporannya dalam bahasa Prancis, tetapi sebagian besar penuh dengan tabel dan angka, dan nomor internasional. Fungsi hash yang diimplementasikan tidak menyertakan kandidat SHA-3 (kecuali SHABAL) tetapi saya sedang mengerjakannya.

Thomas Pornin
sumber
2
Saya rasa tolok ukur Anda tidak berguna. Perbandingan kecepatan dari dua algoritme berdasarkan pada pengoptimalan yang setara tetapi tidak lengkap tidak relevan. Di dunia nyata, Anda tidak menggulung implementasi Anda sendiri, melainkan menggunakan implementasi yang dioptimalkan sepenuhnya. Hasil dari hal itulah yang harus dibandingkan.
Edward Brey
10
@EdwardBrey Sebenarnya ini hampir sepenuhnya dioptimalkan. Nyatanya, implementasi md5-nya bekerja jauh lebih cepat daripada yang ditawarkan OpenSSL, jadi tidak setiap implementasi akan dioptimalkan di "dunia nyata" seperti yang Anda katakan. Juga, meskipun ini tidak sempurna (Anda benar tentang itu) karena mereka berfungsi sebagai jawaban sempurna untuk pertanyaan khusus ini.
Gaspa79
50

Di MacBook Air 2012 saya (Intel Core i5-3427U, 2x 1,8 GHz, 2,8 GHz Turbo), SHA-1 sedikit lebih cepat daripada MD5 (menggunakan OpenSSL dalam mode 64-bit):

$ openssl speed md5 sha1
OpenSSL 0.9.8r 8 Feb 2011
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              30055.02k    94158.96k   219602.97k   329008.21k   384150.47k
sha1             31261.12k    95676.48k   224357.36k   332756.21k   396864.62k

Pembaruan: 10 bulan kemudian dengan OS X 10.9, SHA-1 menjadi lebih lambat di mesin yang sama:

$ openssl speed md5 sha1
OpenSSL 0.9.8y 5 Feb 2013
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              36277.35k   106558.04k   234680.17k   334469.33k   381756.70k
sha1             35453.52k    99530.85k   206635.24k   281695.48k   313881.86k

Pembaruan kedua: Pada OS X 10.10, kecepatan SHA-1 kembali ke level 10.8:

$ openssl speed md5 sha1
OpenSSL 0.9.8zc 15 Oct 2014
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              35391.50k   104905.27k   229872.93k   330506.91k   382791.75k
sha1             38054.09k   110332.44k   238198.72k   340007.12k   387137.77k

Pembaruan ketiga: OS X 10.14 dengan LibreSSL jauh lebih cepat (masih di mesin yang sama). SHA-1 masih menjadi yang teratas:

$ openssl speed md5 sha1
LibreSSL 2.6.5
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              43128.00k   131797.91k   304661.16k   453120.00k   526789.29k
sha1             55598.35k   157916.03k   343214.08k   489092.34k   570668.37k
nwellnhof
sumber
2
Aneh, udaraku sama dengan milikmu dan aku mendapat hasil benchmark yang berlawanan. dengan 8192 byte: md5 305549.52k; sha1 204668.57k
Carlos Fontes
3
Hmm, saya juga mendapatkan hasil yang berbeda dari tahun lalu pada mesin yang sama: md5 381756.70k, sha1 313881.86k. Mungkin karena upgrade ke 10.9 (OpenSSL 0.9.8y).
nwellnhof
6
Itu jawaban yang bagus. itu menunjukkan bahwa Anda peduli. terima kasih pria untuk berbagi
M pada
13

Jawaban sebenarnya adalah: Tergantung

Ada beberapa faktor yang perlu dipertimbangkan, yang paling jelas adalah: cpu tempat Anda menjalankan algoritme ini dan implementasi algoritme.

Misalnya, saya dan teman saya sama-sama menjalankan versi openssl yang sama persis dan mendapatkan hasil yang sedikit berbeda dengan CPU Intel Core i7 yang berbeda.

Pengujian saya di tempat kerja dengan Intel (R) Core (TM) i7-2600 CPU @ 3.40GHz

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              64257.97k   187370.26k   406435.07k   576544.43k   649827.67k
sha1             73225.75k   202701.20k   432679.68k   601140.57k   679900.50k

Dan miliknya dengan Intel (R) Core (TM) i7 CPU 920 @ 2.67GHz

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              51859.12k   156255.78k   350252.00k   513141.73k   590701.52k
sha1             56492.56k   156300.76k   328688.76k   452450.92k   508625.68k

Kami berdua menjalankan binari yang sama persis dari OpenSSL 1.0.1j 15 Okt 2014 dari paket resmi ArchLinux.

Pendapat saya tentang ini adalah bahwa dengan keamanan tambahan sha1, desainer cpu lebih cenderung meningkatkan kecepatan sha1 dan lebih banyak programmer akan mengerjakan pengoptimalan algoritme daripada md5sum.

Saya kira md5 itu tidak akan lagi digunakan suatu hari nanti karena tampaknya md5 tidak memiliki keunggulan dibandingkan sha1. Saya juga menguji beberapa kasus pada file nyata dan hasilnya selalu sama di kedua kasus (kemungkinan dibatasi oleh disk I / O).

md5sum dari file besar 4,6GB membutuhkan waktu yang sama persis dengan sha1sum dari file yang sama, hal yang sama berlaku untuk banyak file kecil (488 dalam direktori yang sama). Saya menjalankan tes lusinan kali dan secara konsisten mendapatkan hasil yang sama.

-

Akan sangat menarik untuk menyelidiki hal ini lebih lanjut. Saya kira ada beberapa ahli yang bisa memberikan jawaban yang solid mengapa sha1 menjadi lebih cepat dari md5 pada prosesor yang lebih baru.

Johnride
sumber
6
Anda benar-benar perlu membeli SSD (dan / atau menghapus McAfee) :)
Maarten Bodewes
1
@owlstead sialan, saya lupa mematikan "mode lambat" kotak Linux saya ketika saya mencoba ini.
Johnride
4
@Johnride, jangan melakukan benchmark dari file. Jalankan dari data dalam memori atau bahkan lebih sederhana hanya mengulangi nilai yang sama.
Robino
1
@Robino itulah yang openssl speeddilakukannya, yang merupakan tolok ukur pertama dan paling berarti.
Johnride
1

MD5 juga mendapat manfaat dari penggunaan SSE2, lihat BarsWF lalu beri tahu saya bahwa tidak. Yang diperlukan hanyalah sedikit pengetahuan assembler dan Anda dapat membuat sendiri rutinitas MD5 SSE2. Namun, untuk jumlah throughput yang besar, ada pertukaran kecepatan selama hashing dibandingkan dengan waktu yang dihabiskan untuk mengatur ulang data input agar kompatibel dengan instruksi SIMD yang digunakan.

Bob si tukang bangunan
sumber
3
Pada pandangan pertama, tidak jelas apakah SSE2 digunakan untuk mempercepat satu utas MD5 atau untuk memasangkan beberapa utas MD5 paralel; yang terakhir tentu saja mudah untuk sebagian besar algoritme, tetapi itu tidak dihitung sebagai manfaat dari SSE2 karena biasanya yang dibutuhkan adalah aliran data tunggal.
lapo
0

sha1sum sedikit lebih cepat di Power9 daripada md5sum

$ uname -mov
#1 SMP Mon May 13 12:16:08 EDT 2019 ppc64le GNU/Linux

$ cat /proc/cpuinfo
processor       : 0
cpu             : POWER9, altivec supported
clock           : 2166.000000MHz
revision        : 2.2 (pvr 004e 1202)

$ ls -l linux-master.tar
-rw-rw-r-- 1 x x 829685760 Jan 29 14:30 linux-master.tar

$ time sha1sum linux-master.tar
10fbf911e254c4fe8e5eb2e605c6c02d29a88563  linux-master.tar

real    0m1.685s
user    0m1.528s
sys     0m0.156s

$ time md5sum linux-master.tar
d476375abacda064ae437a683c537ec4  linux-master.tar

real    0m2.942s
user    0m2.806s
sys     0m0.136s

$ time sum linux-master.tar
36928 810240

real    0m2.186s
user    0m1.917s
sys     0m0.268s
B Abali
sumber