Quando controlli le stringhe per l'uguaglianza, devi controllare che ogni carattere corrisponda. La maggior parte dei linguaggi di programmazione prenderà una scorciatoia e restituirà False - o Non uguale - non appena troveranno un singolo carattere che non corrisponde. Ad esempio,
str1 = "1111111111111111"
str2 = "1101111111111111"
Sai che non sono uguali appena lo hai colpito, perché continueresti a controllare?
Questo è super-sfruttabile. Immagina di provare a craccare una password (o un hash, o un tag MAC, o qualsiasi cosa che debba essere confrontata per l'uguaglianza), sapendo che il server eseguirà un confronto lazy string da qualche parte all'interno, potrei ottenere i seguenti tempi risultati (completamente inventati):
Tried "aaaaaaaa", it took 0.2 ms
Tried "bbbbbbbb", it took 0.2 ms
Tried "cccccccc", it took 0.4 ms
Fantastico, ora so che la prima lettera è "c" perché ci è voluto più tempo. Ora posso fare lo stesso trucco con "caaaaaaa", "cbbbbbbb", ecc. Craccare una lettera alla volta è HUGELY più veloce che spezzare l'intera password alla volta.
Questo confronto "lazy" delle stringhe è generalmente una buona cosa per i programmatori perché fa girare le cose più velocemente, ma fa male alla sicurezza. I confronti di stringhe sicure controlleranno fino alla fine, anche se troveranno una differenza in modo che non ci sia mai una differenza temporale.