La chiave simmetrica MAC-then-encrypt auth token methodology è sicura? [chiuso]

-1

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

  1. Una volta eseguito correttamente il login, viene creato un token contenente accountID utenti, nonce e expiry . Il token viene quindi restituito al client da utilizzare per la richiesta successiva.
  2. Il client restituisce il token al server con ogni richiesta per identificare l'origine ( accountID ) di qualsiasi richiesta.
  3. Il token contiene un nonce che è cambiato con ogni richiesta.
  4. Viene creata una MAC dal valore plaintext per garantire che non sia stata manomessa.
  5. Il valore plaintext del token (incluso MAC ) viene quindi crittografato per garantire che sia oscurato in modo sicuro.
  6. Il client non è mai al corrente di macKey o encryptionKey . Non si intende che il client abbia mai accesso al contenuto di plaintext 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

  1. È 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.
  2. Ho letto che cbc-mode deve essere utilizzato quando si utilizza un metodo MAC-then-encrypt . È questa la modalità predefinita per CryptoJS.AES.encrypt() ?
  3. CryptoJS.AES sembra abbastanza generico. L'impostazione predefinita è AES256 ? O è qualcosa che devo dichiarare esplicitamente nel mio codice?
  4. Quando si passa una stringa a CryptoJS.AES.encrypt() ho letto che genera automaticamente un key e e iv 'dietro le quinte'. Sarebbe più sicuro generare il mio key e iv , o dovrei semplicemente lasciare che CryptoJS lo gestisca?
  5. C'è più sicurezza nell'impiego di un metodo MAC-encrypt-MAC o semplicemente aggiungendo complessità alla logica della mia app?
posta AJB 17.12.2016 - 02:31
fonte

1 risposta

1
  1. Mac-then-Encrypt va perfettamente bene. Esiste un attacco teorico in cui uno schema Mac-then-Encrypt che utilizza una modalità malleabile (come CBC) può essere in grado per un utente malintenzionato di manomettere il testo cifrato per ottenere un testo in chiaro con lo stesso Mac, ma è solo teorico
  2. Non sei limitato alla modalità cbc, proprio come un TLS di esempio utilizza la modalità Mac-then-Encrypt e CTR. Anche ciò che fa di default CryptoJS è definito dall'implementazione, leggi la documentazione, ma penso che CryptoJS.AES.encrypt() imposterà per default una crittografia a blocco singolo o ECB che non è sicuro
  3. Nuova documentazione
  4. La documentazione è tua amica
  5. Non c'è ulteriore sicurezza, semplicemente aumenta la dimensione del tuo messaggio senza motivo. Entrambi i metodi Mac-then-Encrypt e Encrypt-then-Mac sono altrettanto sicuri per quanto ne sappiamo. Anche con l'attacco teorico menzionato prima

L'unica cosa che non capisco nel tuo schema è perché il nonce? È usato per il tuo business? È per una sorta di presunta "sicurezza crittografica"? È usato come token CSRF?

    
risposta data 20.12.2016 - 22:43
fonte

Leggi altre domande sui tag