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
accountID
utenti,nonce
eexpiry
. 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
MAC
dal valoreplaintext
per garantire che non sia stata manomessa. - Il valore
plaintext
del token (inclusoMAC
) viene quindi crittografato per garantire che sia oscurato in modo sicuro. - Il client non è mai al corrente di
macKey
oencryptionKey
. Non si intende che il client abbia mai accesso al contenuto diplaintext
del 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-mode
deve essere utilizzato quando si utilizza un metodoMAC-then-encrypt
. È questa la modalità predefinita perCryptoJS.AES.encrypt()
? -
CryptoJS.AES
sembra 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 unkey
e eiv
'dietro le quinte'. Sarebbe più sicuro generare il miokey
eiv
, o dovrei semplicemente lasciare cheCryptoJS
lo gestisca? - C'è più sicurezza nell'impiego di un metodo
MAC-encrypt-MAC
o semplicemente aggiungendo complessità alla logica della mia app?