NOTE: This question originally conflated a "digital signature" and a "MAC", which I've since learned are not the same thing. Any references (in the answer or any comments) to a "signature" should be read as a "MAC".
Sto sperimentando con token di autenticazione e sto cercando di spiegarmi il metodo migliore.
obiettivi
- Una volta eseguito correttamente il login, viene creato un token contenente
accountIDutenti,nonceeexpiry. Il token viene quindi restituito al client da utilizzare per la richiesta successiva. - Il client restituisce il token al server con ogni richiesta per identificare l'origine (
accountID) di qualsiasi richiesta. - Il token contiene un nonce che è cambiato con ogni richiesta.
- Viene creata una
MACdal valoreplaintextper garantire che non sia stata manomessa. - Il valore
plaintextdel token (inclusoMAC) viene quindi crittografato per garantire che sia oscurato in modo sicuro. - Il client non è mai al corrente di
macKeyoencryptionKey. Non si intende che il client abbia mai accesso al contenuto diplaintextdel token.
Metodo corrente
///process.env.TOKEN_ENCRYPTION_PASSWORD = '13sd4089f-268c-483d-9e82-jk3c1b47c77a';
///process.env.TOKEN_MAC_KEY = '1fde05f4-268c-483d-9e82-85fc1b42321';
/// Successful login by user ...
var token = {
nonce : 'SOME-UUID-GOES-HERE',
accountID : 'account-12345',
expires : 1234567890
};
token.mac = crypto.createHmac('sha512', TOKEN_MAC_KEY)
.update(JSON.stringify(token))
.digest('base64');
var encryptedToken = cryptoJS.AES.encrypt(JSON.stringify(token), TOKEN_ENCRYPTION_PASSWORD).toString();
response.send({
message : 'Created, MAC'd, and encrypted an auth token.',
authToken : encryptedToken
});
Domande
- È sicuro, in questo caso, utilizzare un metodo
MAC-then-encrypt? Ho letto diverse opinioni su questo e sono andato via più confuso di quando ho iniziato. - Ho letto che
cbc-modedeve essere utilizzato quando si utilizza un metodoMAC-then-encrypt. È questa la modalità predefinita perCryptoJS.AES.encrypt()? -
CryptoJS.AESsembra abbastanza generico. L'impostazione predefinita èAES256? O è qualcosa che devo dichiarare esplicitamente nel mio codice? - Quando si passa una stringa a
CryptoJS.AES.encrypt()ho letto che genera automaticamente unkeye eiv'dietro le quinte'. Sarebbe più sicuro generare il miokeyeiv, o dovrei semplicemente lasciare cheCryptoJSlo gestisca? - C'è più sicurezza nell'impiego di un metodo
MAC-encrypt-MACo semplicemente aggiungendo complessità alla logica della mia app?