devo aggiungere una firma sha256 a un token crittografato AES_256_CBC?

0

attualmente creo un token per un'app per dispositivi mobili nella maniera seguente. Decifro il token per elaborare la richiesta e verificare che l'utente abbia effettuato l'accesso. Sono connesso a TLS RSA 2048 bit. Mi chiedevo se $ GLOBALS è sicuro e se aggiungere un hmac_sha256 renderebbe il mio token più difficile da falsificare o non cambierebbe molto.

$GLOBALS['encryption_key'] = <<<'EOT'
 MIGsAgEAAiEAwtvvzQzXiesVUPxXV7+jvUbmXfavBqxdakC1Tn+PpmcCAwEAAQIg
 WtklzWkOWKv0zURJCI09riGVIPIzGx1XPmFVaAbOeBECEQDynUX9BuIv3k6IA1wm
 IcSpAhEAzZwpEHQtbj3xpiWy34/sjwIRAJ2ltmmxBF6obI0S6djZTmkCEQDLpv5h
 hsEs7Xv5lmOK3lJvAhEAxJzS4NEgH2fF7mfaLfIWWg==
 EOT;

function new_auth_token($user) {
  $token_data = [
      'param1'   => 'type',
      'param2'   => $user['p2'],
      'param3'   => $user['p3'],
      'param4'   => $user['p4'],
      'param5'   => $user['p5'],
      'expedite' => (time() + (3600*24*180))
  ];
  $json  = json_encode($token_data);
  $iv    = openssl_random_pseudo_bytes(openssl_cipher_iv_length(AES_256_CBC));
  $ssl   = openssl_encrypt($json, AES_256_CBC, $GLOBALS['encryption_key'], 0, $iv);
  $token = base64_encode($ssl).'.'.base64_encode($iv);
  return $token;
}
    
posta Nicolas Manzini 28.10.2015 - 19:53
fonte

2 risposte

2

È necessario autenticare il testo cifrato perché la crittografia è malleabile. Il modo migliore è usare un AEAD. Se non puoi farlo, dovresti usare hmac-sha256 con una chiave che deve rimanere segreta, ma deve essere diversa dalla chiave AES. È necessario MAC IV e il testo cifrato dopo aver crittografato e archiviato il risultato nel token (come si memorizza il IV). È necessario controllare il MAC prima di provare a decrittografare il testo cifrato. È necessario utilizzare una funzione di confronto del tempo costante per verificare il MAC.

Altrimenti le persone possono decifrare messaggi, falsi messaggi, magari estrarre il tasto AES.

Hai notato tutti i "must"? È facile rovinarlo. Dovresti preferire un api di livello superiore che lo faccia correttamente e non ti permetta di sbagliare. Prova la libsodium.

Modifica

Note sul tuo codice:

La tua "chiave di crittografia AES" è una chiave privata RSA. Sai che le chiavi RSA non sono chiavi AES, giusto? Inoltre, RSA a 256 bit è completamente inutile, rotto in pochi minuti su un laptop. BTW, ora che hai pubblicato la chiave RSA, non puoi usarla per nulla di reale, anche se era una chiave strong (le chiavi RSA con modulo di 2048 bit e superiore sono sicure).

Le chiavi AES-256 sono array di byte di lunghezza 32 byte. In base64 sarebbero 45 byte. È necessario decodificare il base64 prima di utilizzare la stringa in crittografia o decrittografia. Puoi generare forti chiavi AES in questo modo: head -c32 /dev/urandom | base64 .

Dovresti utilizzare una libreria con un'API che non ti consente di passare una stringa con la presunta chiave AES di lunghezza errata.

In conclusione, dovresti leggere molto di più su crypto prima di provare a utilizzarlo con le informazioni sensibili di qualcuno.

    
risposta data 28.10.2015 - 20:33
fonte
0

Inserisci l'hash sha del token sul client e registra il token in una sessione o in un altro meccanismo di memorizzazione permanente della memoria.

Ogni richiesta che il client invierebbe l'hash sha del token al server in quel momento il token crittografato corrispondente potrebbe essere sottoposto a hashing, riconvalidato, decrittografato e verificato per le autorizzazioni ecc.

Sarebbe il più semplice I termini del tempo di sviluppo ecc.

A seconda del livello di sicurezza che desideri implementare, la risposta degli altri poster riguardo alle firme digitali e / o hmac del token è un'altra strada.

Dovresti davvero scartare tutto e cercare soluzioni esistenti come oAuth (ti consiglierei la versione 1 della specifica se non sei pronto a utilizzare le primitive crittografiche).

    
risposta data 29.10.2015 - 03:55
fonte

Leggi altre domande sui tag