The first one uses randomly generated CSRF tokens which uses a cryptographic strong random generator to generate the token.
Questo è l'ideale. In questo caso, il token è un blocco opaco assolutamente imprevedibile senza alcun significato al di fuori del contesto previsto.
The second implementation I found uses HMAC which encrypts the session id with
secret key stored in the server side config.
È più semplice da implementare. Presumibilmente gli ID di sessione sono già stati generati, quindi non è necessario perseguire nulla di aggiuntivo. Poiché non è necessario ulteriore spazio di archiviazione, è possibile che questo meccanismo possa essere implementato in situazioni in cui un token casuale non può essere utilizzato in un progetto legacy. Questa è una soluzione relativamente elegante. Supponendo che la chiave segreta non diventi nota all'attaccante, il token non dovrebbe essere riproducibile al di fuori del server.
The third implentation I saw uses a combination of both, a secret key stored in the server side config is used to HMAC a random generated value
Questo è un po 'sciocco. Presumibilmente spinto dal fatto che un HMAC è un concetto di sicurezza, l'autore tenta di aggiungere sicurezza al suo progetto includendo qualcosa legato alla sicurezza. Una sorta di magico talismano della sicurezza. Presumibilmente non è peggiore che usare solo il numero casuale, ma certamente non è meglio. A meno che non si contenga la calda sensazione di confusione derivante dall'utilizzo di HMAC nell'implementazione della sicurezza.
È è , tuttavia, una soluzione ragionevole se hai un RNG scadente, anche se in questo caso probabilmente combinerei l'ID di sessione o qualcosa di simile lì prima dell'hashing in modo che tu sia garantito che il numero di hash in unico.