I sistemi di crittografia a chiave pubblica, incluso RSA, sono piuttosto lenti e la necessità di autenticare un'intera comunicazione può a volte scontrarsi con il ritardo inserito dal criptare l'intero messaggio alla sorgente e dal decriptarlo alla destinazione.
Per rendere più efficiente il meccanismo si utilizza una funzione di hash attraverso la quale si calcola una stringa identificativa del messaggio, detta fingerprint (impronta digitale) o message digest composta da un numero limitato di caratteri (solitamente 128 bit). Questa stringa rappresenta una sintesi del messaggio che è ottenuta attraverso una funzione non invertibile (dato l'hash non si risale al messaggio) e che ha una probabilità di generare la stessa fingerprint per due messaggi diversi molto bassa. La funzione di hash deve inoltre essere molto veloce da calcolare, in modo da rendere significativamente vantaggioso creare il fingerprint del messaggio e criptare quello, piuttosto che criptare tutto il messaggio.
A questo punto è possibile autenticare il messaggio limitando l'uso dell'algoritmo di crittografia a chiave pubblica al solo fingerprint. Quando A vuole mandare a B un messaggio autenticato e integro, calcola il fingerprint, lo cripta con la sua chiave privata e lo aggancia in fondo al messaggio in chiaro. Quando B riceve il messaggio può decriptare con la chiave pubblica di A il fingerprint e verificare che esso corrisponde applicando la funzione di hash al messaggio ricevuto. Se non c'è conformità tra il fingerprint calcolato e quello autenticato, il messaggio non è integro.
Un algoritmo di hash molto utilizzato in crittografia è MD5 (Message Digest 5, 1992) che produce fingerprint di 128 bit.