Il calcolo di un hash MD5 richiede meno CPU rispetto alle funzioni della famiglia SHA?


115

Il calcolo di un hash MD5 richiede meno CPU rispetto a SHA-1 o SHA-2 su hardware x86 laptop "standard"? Mi interessano informazioni generali, non specifiche di un determinato chip.

AGGIORNAMENTO: Nel mio caso, mi interessa calcolare l'hash di un file. Se la dimensione del file è importante, supponiamo che sia 300K.


Questa non è una risposta alla tua domanda, ma i sostenitori di Skein hanno avanzato la sua velocità, e non è certamente più debole dell'MD5 a fine vita in questo momento. Nei messaggi che devi hash è molto breve, la velocità può essere uno svantaggio per una funzione hash crittografica (in particolare, quanto velocemente qualcun altro può implementarla, non quanto velocemente gira sul tuo laptop). schneier.com/skein1.2.pdf
Pascal Cuoq

4
@Pascal: Skein non è il più veloce dei candidati SHA-3, però, specialmente su piattaforme a 32 bit. Su un x86 a 64 bit, Skein raggiunge circa 300 MB / s (Skein-512 è leggermente più veloce di Skein-256), che è paragonabile a SHA-1, ma in modalità a 32 bit, le prestazioni scendono a meno di 60 MB / s, due volte più lento di SHA-256. D'altra parte, SHABAL, un altro candidato SHA-3, offre prestazioni simili a SHA-1 su entrambe le piattaforme a 32 bit e 64 bit.
Thomas Pornin

Risposte:


123

Sì, MD5 richiede meno CPU. Sul mio Intel x86 (Core2 Quad Q6600, 2,4 GHz, utilizzando un core), ottengo questo in modalità a 32 bit:

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

e questo in modalità a 64 bit:

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

Le cifre sono in megabyte al secondo, per un messaggio "lungo" (questo è ciò che ottieni per messaggi più lunghi di 8 kB). Questo è con sphlib , una libreria di implementazioni di funzioni hash in C (e Java). Tutte le implementazioni provengono dallo stesso autore (io) e sono state realizzate con sforzi comparabili per l'ottimizzazione; quindi le differenze di velocità possono essere considerate come realmente intrinseche alle funzioni.

Come punto di confronto, considera che un disco rigido recente funzionerà a circa 100 MB / s e qualsiasi cosa tramite USB supererà i 60 MB / s. Anche se SHA-256 sembra "lento" qui, è abbastanza veloce per la maggior parte degli scopi.

Si noti che OpenSSL include un'implementazione a 32 bit di SHA-512 che è abbastanza più veloce del mio codice (ma non veloce come SHA-512 a 64 bit), perché l'implementazione di OpenSSL è in assembly e utilizza i registri SSE2, cosa che non può essere fatto in chiaro C. SHA-512 è l'unica funzione tra quelle quattro che beneficia di un'implementazione SSE2.

Modifica: in questa pagina ( archivio ), è possibile trovare un report sulla velocità di molte funzioni hash (cliccare sul link "Telechargez maintenant"). Il rapporto è in francese, ma è per lo più pieno di tabelle e numeri, e i numeri sono internazionali. Le funzioni hash implementate non includono i candidati SHA-3 (eccetto SHABAL) ma ci sto lavorando.


2
Non penso che i tuoi benchmark siano utili. Un confronto della velocità di due algoritmi basato su un'ottimizzazione equivalente ma incompleta è irrilevante. Nel mondo reale, non si esegue la propria implementazione, ma si utilizzano invece implementazioni completamente ottimizzate. I risultati di questi sono ciò che dovrebbe essere confrontato.
Edward Brey

10
@EdwardBrey In realtà questi sono abbastanza vicini all'ottimizzazione completa. In effetti la sua implementazione md5 funziona molto più velocemente di quella offerta da OpenSSL, quindi non tutte le implementazioni saranno ottimizzate nel "mondo reale" come dici tu. Inoltre, sebbene questi non siano perfetti (hai ragione su questo) imho servono come risposta perfetta a questa particolare domanda.
Gaspa79

50

Sul mio MacBook Air 2012 (Intel Core i5-3427U, 2x 1,8 GHz, 2,8 GHz Turbo), SHA-1 è leggermente più veloce di MD5 (utilizzando OpenSSL in modalità 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

Aggiornamento: 10 mesi dopo con OS X 10.9, SHA-1 è diventato più lento sulla stessa macchina:

$ 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

Secondo aggiornamento: su OS X 10.10, la velocità SHA-1 è tornata al livello 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

Terzo aggiornamento: OS X 10.14 con LibreSSL è molto più veloce (sempre sulla stessa macchina). SHA-1 è ancora in cima:

$ 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

2
strano, la mia aria è la stessa della tua e ho ottenuto risultati di benchmark opposti. con 8192 byte: md5 305549.52k; sha1 204668.57k
Carlos Fontes

3
Hmm, ottengo anche risultati diversi rispetto allo scorso anno sulla stessa macchina: md5 381756.70k, sha1 313881.86k. Forse a causa dell'aggiornamento a 10.9 (OpenSSL 0.9.8y).
nwellnhof

6
Questa è un'ottima risposta. mostra che ci tieni. grazie uomo per la condivisione
M al

13

La vera risposta è: dipende

Ci sono un paio di fattori da considerare, i più ovvi sono: la CPU su cui stai eseguendo questi algoritmi e l'implementazione degli algoritmi.

Ad esempio, io e il mio amico eseguiamo la stessa identica versione di openssl e otteniamo risultati leggermente diversi con CPU Intel Core i7 diverse.

Il mio test al lavoro con una CPU Intel (R) Core (TM) i7-2600 a 3,40 GHz

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

E il suo con una CPU Intel (R) Core (TM) i7 920 a 2,67 GHz

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

Entrambi eseguiamo gli stessi identici binari di OpenSSL 1.0.1j 15 ottobre 2014 dal pacchetto ufficiale di ArchLinux.

La mia opinione su questo è che con la sicurezza aggiunta di sha1, è più probabile che i progettisti di CPU migliorino la velocità di sha1 e più programmatori lavoreranno sull'ottimizzazione dell'algoritmo rispetto a md5sum.

Immagino che un giorno md5 non verrà più utilizzato poiché sembra che non abbia alcun vantaggio su sha1. Ho anche testato alcuni casi su file reali ei risultati sono stati sempre gli stessi in entrambi i casi (probabilmente limitati dall'I / O del disco).

md5sum di un file di grandi dimensioni da 4,6 GB ha richiesto lo stesso identico tempo di sha1sum dello stesso file, lo stesso vale per molti file di piccole dimensioni (488 nella stessa directory). Ho eseguito i test una dozzina di volte e hanno ottenuto costantemente gli stessi risultati.

-

Sarebbe molto interessante approfondire questo aspetto. Immagino che ci siano alcuni esperti in giro che potrebbero fornire una risposta solida al motivo per cui sha1 sta diventando più veloce di md5 sui processori più recenti.


6
Hai seriamente bisogno di acquistare un SSD (e / o rimuovere McAfee) :)
Maarten Bodewes

1
@owlstead damn mi sono dimenticato di disattivare la "modalità lenta" delle mie macchine Linux quando l'ho provato.
Johnride

4
@ Johnride, non eseguire il benchmark da un file. Eseguilo dai dati in memoria o, anche più semplice, basta ripetere lo stesso valore.
Robino

1
@Robino è quello che openssl speedfa, che è il primo e più significativo benchmark.
Johnride

1

MD5 beneficia anche dell'utilizzo di SSE2, controlla BarsWF e poi dimmi che non lo fa. Tutto ciò che serve è un po 'di conoscenza dell'assemblatore e puoi creare le tue routine SSE2 MD5. Per grandi quantità di throughput, tuttavia, c'è un compromesso tra la velocità durante l'hashing rispetto al tempo speso per riorganizzare i dati di input in modo che siano compatibili con le istruzioni SIMD utilizzate.


3
Ad una prima occhiata non è chiaro se SSE2 viene utilizzato per velocizzare un thread MD5 o per accoppiare alcuni thread MD5 paralleli; quest'ultimo è ovviamente facile per la maggior parte degli algoritmi, ma questo non conta come beneficiare di SSE2 poiché di solito ciò che serve è un singolo flusso di dati.
lapo

0

sha1sum è un po 'più veloce su Power9 rispetto a 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.