Sicurezza basata sulla soluzione KeePass basata sul Web

1

Sto pensando di creare una soluzione KeePass basata sul web in Symfony 3 (PHP) per avere la password sicura con poche altre funzionalità aggiunte. Voglio assicurarmi che non ci siano grossi problemi di sicurezza. Ecco le ipotesi:

  1. Server aziendale interno, servizio interno
  2. Il sito web funziona solo su HTTPS
  3. L'utente deve prima accedere (LDAP, la politica della password aziendale è abbastanza severa)
  4. Dopo l'accesso, l'utente deve immettere la password di crittografia che verrà utilizzata come chiave di crittografia dopo essere stata sottoposta a hash con SHA256 (hash ('sha256', $ key, true))
  5. La password di crittografia inserita viene verificata se valida confrontando un singolo valore decrittografato con un valore previsto noto
  6. Metodi di crittografia / decrittografia, utilizzati per conservare / recuperare le password dal DB:

    public function encrypt($openText) {
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
        $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
    
        $encryptedPayload = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->keyHash, $openText, MCRYPT_MODE_CBC, $iv);
    
        $encryptedBinary = $iv . $encryptedPayload;
    
        return $encryptedBinary;
    }
    
    public function decrypt($encryptedBinary) {
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
        $iv = substr($encryptedBinary, 0, $ivSize);
    
        $encryptedPayload = substr($encryptedBinary, $ivSize);
    
        $openText = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->keyHash, $encryptedPayload, MCRYPT_MODE_CBC, $iv), "\x00");
    
        return $openText;
    }
    
  7. L'hash della chiave di crittografia viene mantenuto nella sessione utente

  8. La sessione utente scade dopo 120 secondi dall'ultima attività
  9. Le password non vengono mantenute nel codice HTML del sito Web - vengono letti dal server ogni volta che si utilizza AJAX su HTTPS, si inserisce temporaneamente l'attributo dell'elemento HTML da copiare da JS e quindi l'attributo viene rimosso
  10. Le password vengono copiate negli appunti utilizzando clipboard.js
  11. Gli Appunti vengono cancellati (copiando la stringa vuota) dopo 15 secondi

Vedi qualche problema di sicurezza qui (considerando la progettazione webapp, rispetto a KeePass)? A cosa dovrei prestare particolare attenzione?

    
posta FoxException 23.08.2016 - 14:38
fonte

2 risposte

4

Molti potenziali problemi qui.

In primo luogo, stai utilizzando PHP, ed è difficile fare le cose correttamente (come evitare l'iniezione SQL, crittografare in modo sicuro, ecc.) in PHP. Non è impossibile, in nessun modo, ma è irragionevolmente difficile.

In secondo luogo, come ha sottolineato un commentatore, stai eseguendo l'hashing di una password con SHA256 per generare la chiave. Questo non va bene. Utilizzare un PBKDF appropriato, come bcrypt.

In terzo luogo, stai utilizzando la versione a dimensione di 256 byte di Rijndael, che è semplicemente strana. Non farlo, come molti altri hanno prima di te, confondilo con AES-256.

In quarto luogo, non crittografare i dati direttamente con la chiave derivata. Crittografalo con una chiave di crittografia dei dati generata in modo casuale e che a sua volta è protetta con la chiave derivata dalla password dell'utente. In questo modo l'utente può modificare la propria password di crittografia master senza dover quindi decrittografare tutte le password con la vecchia chiave in modo sincrono e ricodificarle con la nuova chiave. Devi solo crittografare nuovamente la chiave di crittografia dei dati con la chiave di crittografia chiave.

Quinto, logging, rate-limited, IDS. Devi avere un sistema per smorzare gli attacchi e farti sapere quando accadono.

Questo è abbastanza per ora. Sono sicuro che ci sono molte altre insidie ... Questa è solo una lista dal mio primo sguardo. Vi incoraggio vivamente a rinunciare completamente a questo progetto e cercare una soluzione esistente, ragionevolmente comprovata come 1Password for Teams o qualcosa del genere. Costruire un sistema come questo è irto di pericoli, e l'esempio di codice che hai fornito mi indica che probabilmente non hai ancora le conoscenze necessarie per realizzarlo con un ragionevole livello di sicurezza nella sua sicurezza. E questo non è un colpo contro di te ... Questi sono semplicemente incredibili sistemi difficili da costruire in modo sicuro, e qualcuno che tenti di farlo per la prima volta senza una guida oltre a ciò che Internet può fornire, non lo farà.

    
risposta data 23.08.2016 - 17:43
fonte
1

Manca una revisione del codice. Keepass è open-source ed è stato revisionato indipendentemente.

Anche se il design è corretto, ottenere l'implementazione giusta è estremamente difficile.

Considera il costo di un controllo.

    
risposta data 23.08.2016 - 16:47
fonte