Abbiamo bisogno di generare URL resistenti alle manomissioni per accedere a un servizio, che vengono poi condivisi con l'utente finale. Gli URL non contengono dati riservati, ma dobbiamo assicurarci che non siano stati manomessi poiché sono stati generati. Spetta all'utente finale mantenere questi dati confidenziali.
Sembra che un MAC (come HMACSha256) sia appropriato per l'autenticazione degli URL. Mi piacerebbe anche includere un salt e timestamp per rendere la chiave MAC meno probabile e in modo che gli URL firmati possano naturalmente scadere.
Stavo pensando che PBKDF2 potrebbe essere un buon modo per generare la chiave MAC, ad esempio:
pepper = "xyzzy"
importantFullUrl = "https://....."
salt = secureRandomBits(256)
url = importantFullUrl + "&ts=987654321&salt=" + base62(salt)
signingKey = PBKDF2(pepper, salt, 10000 /*iterations*/, 256 /*bits*/)
mac = hmacSha256(url, signingKey)
signedUrl = url + "&sig=" + base62(mac)
Un approccio alternativo che ho visto ignora il passaggio PBKDF2 e genera semplicemente il MAC in base ai valori url
e pepper
sopra, cioè:
mac = hmacSha256(url, pepper)
Un approccio offre molti più vantaggi di sicurezza rispetto all'altro? Dato che gli URL scadranno dopo un periodo (ad esempio, 24-48 ore), è importante in questo caso? Come faccio a scegliere un conteggio iterativo adatto per un determinato timeout?
Esiste un approccio descritto in questa domanda che coinvolge una password fornita dall'utente. Gli utenti del nostro servizio sono autenticati utilizzando un meccanismo diverso e non hanno una password esplicita. Anche questo non è per un servizio web, e tutti questi URL firmati verranno generati dal lato server e ricontrollati sul lato server.