MD5, SHA-1, SHA-256 and SHA-512 speed performance – Automation Rhapsody (2024)

MD5, SHA-1, SHA-256 and SHA-512 speed performance

Last Updated on by Lyudmil Latinov

For Implement secure API authentication over HTTP with Dropwizardpost, a one-way hash function was needed. Severalfactors are important when choosing hash algorithm: security, speed, and purpose of use.

Security

MD5 and SHA-1 are compromised. Those shall not be used unless their speed is several times slower than SHA-256 or SHA-512.Other that remain are SHA-256 and SHA-512. They are from SHA-2 family and are much more secure.SHA-256 is computed with 32-bit words, SHA-512 with 64-bit words.

Hash implementations

For generating cryptographic hashes in Java there is Apache Commons Codeclibrary which is very convenient.

Speed performance

In order to test the speed sample code is used:

import java.util.UUID;import org.apache.commons.codec.digest.DigestUtils;import org.apache.commons.lang.time.StopWatch;public class Test {private static final int TIMES = 1_000_000;private static final String UUID_STRING = UUID.randomUUID().toString();public static void main(String[] args) {System.out.println(generateStringToHash());System.out.println("MD5: " + md5());System.out.println("SHA-1: " + sha1());System.out.println("SHA-256: " + sha256());System.out.println("SHA-512: " + sha512());}public static long md5() {StopWatch watch = new StopWatch();watch.start();for (int i = 0; i < TIMES; i++) {DigestUtils.md5Hex(generateStringToHash());}watch.stop();System.out.println(DigestUtils.md5Hex(generateStringToHash()));return watch.getTime();}public static long sha1() {...System.out.println(DigestUtils.sha1Hex(generateStringToHash()));return watch.getTime();}public static long sha256() {...System.out.println(DigestUtils.sha256Hex(generateStringToHash()));return watch.getTime();}public static long sha512() {...System.out.println(DigestUtils.sha512Hex(generateStringToHash()));return watch.getTime();}public static String generateStringToHash() {return UUID.randomUUID().toString() + System.currentTimeMillis();}}

Several measurements were done. Two groups – one with smaller length string to hash and one with longer. Each group had following variations ofgenerateStringToHash() method:

  • cached UUID – no extra time should be consumed
  • cached UUID + current system time – in this case, time is consumed to get system time
  • new UUID + current system time – in this case, time is consumed for generating the UUID and to get system time

Raw results

Five measurements were made for each case anaverage value calculated. Time is in milliseconds per 1 000 000 calculations. The system is 64 bits Windows 10 with 1 core Intel i7 2.60GHz and 16GB RAM.

  • generateStringToHash() with: return UUID_STRING;

Data to encode is ~36 characters in length (f5cdcda7-d873-455f-9902-dc9c7894bee0). UUID is cached and time stampis not taken. No additional time is wasted.

Hash#1 (ms)#2 (ms)#3 (ms)#4 (ms)#5 (ms)Average per 1M (ms)
MD5649623621624620627.4
SHA-1608588630600594604
SHA-256746724741720758737.8
SHA-512107310551050105210521056.4
  • generateStringToHash() with: return UUID_STRING + System.currentTimeMillis();

Data to encode is ~49characters in length (aa096640-21d6-4f44-9c49-4115d3fa69381468217419114). UUID is cached.

Hash#1 (ms)#2 (ms)#3 (ms)#4 (ms)#5 (ms)Average per 1M (ms)
MD5751789745806737765.6
SHA-1768765694763751748.2
SHA-256842876848839850851
SHA-512116111521164115411631158.8
  • generateStringToHash() with: return UUID.randomUUID().toString() + System.currentTimeMillis();

Data to encode is ~49characters in length (1af4a3e1-1d92-40e7-8a74-7bb7394211e01468216765464). New UUID is generated on each calculation so time for its generation is included in total time.

Hash#1 (ms)#2 (ms)#3 (ms)#4 (ms)#5 (ms)Average per 1M (ms)
MD5150514711518146314871488.8
SHA-1133313091323132613341325
SHA-256150514961507149815161504.4
SHA-512183418271833183618571837.4
  • generateStringToHash() with:return UUID_STRING + UUID_STRING;

Data to encode is ~72 characters in length (57149cb6-991c-4ffd-9c98-d823ee8a61f757149cb6-991c-4ffd-9c98-d823ee8a61f7). UUID is cached and time stampis not taken. No additional time is wasted.

Hash#1 (ms)#2 (ms)#3 (ms)#4 (ms)#5 (ms)Average per 1M (ms)
MD5856824876811828839
SHA-1921896970904893916.8
SHA-256114511371241114111771168.2
SHA-512113311311116110211101118.4
  • generateStringToHash() with: return UUID_STRING + UUID_STRING + System.currentTimeMillis();

Data to encode is ~85 characters in length (759529c5-1f57-4167-b289-899c163c775e759529c5-1f57-4167-b289-899c163c775e1468218673060). UUID is cached.

Hash#1 (ms)#2 (ms)#3 (ms)#4 (ms)#5 (ms)Average per 1M (ms)
MD5102910351034101210371029.4
SHA-110081016102710079901009.6
SHA-256125412491290125912481260
SHA-512122812211232123012261227.4
  • generateStringToHash() with: final String randomUuid = UUID.randomUUID().toString();
    return randomUuid + randomUuid + System.currentTimeMillis();

Data to encode is ~85 characters in length (2734b31f-16db-4eba-afd5-121d0670ffa72734b31f-16db-4eba-afd5-121d0670ffa71468217683040). New UUID is generated on each calculation so time for its generation is included in total time.

Hash#1 (ms)#2 (ms)#3 (ms)#4 (ms)#5 (ms)Average per 1M (ms)
MD5175317571739175116911738.2
SHA-1163416341627163416331632.4
SHA-256196219561988198819241963.6
SHA-512190919461936192918951923

Aggregatedresults

Results from all iterations are aggregated and compared in the table below. There are 6 main cases. They are listed below and referenced in the table:

  • Case 1 –36 characters length string, UUID is cached
  • Case 2 –49 characters lengthstring,UUID is cached and system time stamp is calculated each iteration
  • Case 3 –49 characters lengthstring, new UUID is generated on each iterationand system time stamp is calculated each iteration
  • Case 4 –72 characters lengthstring, UUID is cached
  • Case 5 –85 characters lengthstring,UUID is cachedand system time stamp is calculated each iteration
  • Case 6 –85 characters lengthstring, new UUID is generated on each iterationand system time stamp is calculated each iteration

All times below are per 1 000 000 calculations:

HashCase 1 (ms)Case 2 (ms)Case 3 (ms)Case 4 (ms)Case 5 (ms)Case 6 (ms)
MD5627.4765.61488.88391029.41738.2
SHA-1604748.21325916.81009.61632.4
SHA-256737.88511504.41168.212601963.6
SHA-5121056.41158.81837.41118.41227.41923

Compare results

Some conclusions of the results based on two cases with short string (36 and 49 chars) and longer string (72 and 85 chars).

  • SHA-256 is faster with 31% than SHA-512 only when hashing small strings. When the string is longerSHA-512 is faster with 2.9%.
  • Time to get system time stamp is ~121.6 ms per 1M iterations.
  • Time to generate UUID is ~670.4 ms per 1M iterations.
  • SHA-1 is fastest hashing function with ~587.9 ms per 1M operations for short strings and 881.7 ms per 1M for longer strings.
  • MD5 is 7.6% slower than SHA-1 for short strings and 1.3% for longer strings.
  • SHA-256 is 15.5% slower than SHA-1 for short strings and 23.4% for longer strings.
  • SHA-512 is 51.7% slower that SHA-1 for short strings and 20% for longer.

Hash sizes

Important data to consider is hash size that is produced by each function:

  • MD5 produces 32 chars hash –5f3a47d4c0f703c5d83265c3669f95e6
  • SHA-1 produces 40 chars hash –2c5a70165585bd4409aedeea289628fa6074e17e
  • SHA-256 produces 64 chars hash –b6ba4d0a53ddc447b25cb32b154c47f33770d479869be794ccc94dffa1698cd0
  • SHA-512 produces 128 chars hash –54cdb8ee95fa7264b7eca84766ecccde7fd9e3e00c8b8bf518e9fcff52ad061ad28cae49ec3a09144ee8f342666462743718b5a73215bee373ed6f3120d30351

Purpose of use

In specific case this research was made for hashed string will be passed as API request. It is constructed from API Key + Secret Key + current time in seconds. So if API Key is something like 15-20 chars, Secret Key is 10-15 chars and time is 10 chars, total length of string to hash is 35-45 chars. Since it is being passed as request param it is better to be as short as possible.

Select hash function

Based on all data so far SHA-256 is selected. It is from secure SHA-2 family. It is much faster than SHA-512 with shorter stings and it produces 64 chars hash.

Conclusion

The current post gives a comparison of MD5, SHA-1, SHA-256 and SHA-512 cryptographic hash functions. Important is that comparison is very dependant on specific implementation (Apache Commons Codec), the specific purpose of use (generate a secure token to be sent with API call). It is goodMD5 and SHA-1 to be avoided as they are compromised and not secure. If their speed for given context is several times faster than secure SHA-2 ones and security is not that much important they can be chosen though. When choosing cryptographic hash function everything is up to a context of usage and benchmark tests for this context is needed.

Related Posts

  • Implement secure API authentication over HTTP with Dropwizard

  • How to implement secure REST API authentication over HTTP

Category: Java | Tags: Performance

MD5, SHA-1, SHA-256 and SHA-512 speed performance – Automation Rhapsody (2024)
Top Articles
Latest Posts
Article information

Author: Terrell Hackett

Last Updated:

Views: 5394

Rating: 4.1 / 5 (72 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Terrell Hackett

Birthday: 1992-03-17

Address: Suite 453 459 Gibson Squares, East Adriane, AK 71925-5692

Phone: +21811810803470

Job: Chief Representative

Hobby: Board games, Rock climbing, Ghost hunting, Origami, Kabaddi, Mushroom hunting, Gaming

Introduction: My name is Terrell Hackett, I am a gleaming, brainy, courageous, helpful, healthy, cooperative, graceful person who loves writing and wants to share my knowledge and understanding with you.