Il numero di sicurezza è una derivazione dell'identificatore stabile e della chiave pubblica di un utente. I numeri di sicurezza sono calcolati per entrambe le persone in una conversazione.
Il vero codice importante è questo snipit
byte[] publicKey = getLogicalKeyBytes(unsortedIdentityKeys);
byte[] hash = ByteUtil.combine(ByteUtil.shortToByteArray(FINGERPRINT_VERSION), publicKey, stableIdentifier.getBytes());
for (int i=0;i<iterations;i++) {
digest.update(hash);
hash = digest.digest(publicKey);
}
Quello che sta succedendo è che stiamo prendendo la versione dell'impronta digitale, la chiave pubblica e l'identificatore stabile come input iniziali e hashing che una volta con SHA-512. La seconda iterazione utilizza la chiave pubblica per l'hash appena creato, quindi la blocca una seconda volta.
Questo processo di aggiunta della chiave pubblica e ripetizione dell'hash continua per il numero di iterazioni indicate.
Perché dobbiamo fare più iterazioni rispetto al passato?
Ciò è dovuto a un problema fondamentale in caso di hashing. Qual è la possibilità di collisioni di hash.
Diciamo che sono un attaccante (Eve). Alice vuole parlare con Bob, quindi Signal invia la sua chiave pubblica a Bob, ma Eve intercetta la chiave pubblica e la sostituisce. Normalmente c'è un'indicazione che la chiave è cambiata e il Numero di sicurezza cambia.
SE Eve aveva abbastanza risorse da poter costruire una chiave pubblica che corrispondesse al numero di sicurezza. Per combattere questa minaccia, facciamo in modo che Eva debba trovare una collisione che si verifica dopo 5200 round di hashing, con l'aggiunta della stessa chiave ogni round.
Ciò diventa impossibile da computare poiché ogni round di hashing rende la ricerca di una collisione linearmente più dispendiosa dal punto di vista computazionale. Il numero di iterazioni attualmente selezionate di solito è calcolato sulla durata dell'attacco di questo stile in base alle risorse della minaccia percepita.
Non riesco a trovare alcun calcolo da Signal in merito al motivo specifico per cui hanno scelto 5200.