Questo articolo: Vita in un mondo post-database: utilizzando la crittografia per evitare le scritture DB
Mi ha chiesto di scrivere questo url-crypt modulo Node.js per convertire un Segreto in stringhe di base64 sicuri urlsafe.
Pensa a un link di verifica email che non ha bisogno di memorizzare i suoi dati nel database. Oppure, un token JWT le cui attestazioni sono segrete anziché base64.
L'idea è di crittografare e archiviare una quantità ragionevole di dati (< 512 caratteri) in < 2k char di base64 (un URL) in modo che possa essere decrittografato in seguito.
L'ho pubblicato su npm e poi ho pensato. È sicuro? Insecure sarebbe inutile per gli altri: - /
Come funziona:
var urlCrypt = require('url-crypt')('super-secret-key');
var data = { hello: 'world', this: 'is a test', of: 'url-crypt' };
var base64 = urlCrypt.cryptObj(data);
var backAgain = urlCrypt.decryptObj(base64);
expect(backAgain).to.eql(data);
Che cosa fa: urlCrypt.cryptObj(obj)
:
- Converte obj in JSON
- Gzips the JSON
- Crea 30 byte di sale
- Crittografa [sale] [gzip] con aes-256-cbc e un pbkdf2 di chiave
- Converti in base64
E di nuovo indietro.
Il codice è composto da 2 funzioni su un solo file.
Alcune domande specifiche:
-
Qui aggiunge un po 'di jitter come protezione contro gli attacchi di dizionario. Questo lo rende più strong?
-
Qui utilizza pbkdf2 per creare la chiave AES. Il sale è costante. Pbkdf2 in questo modo lo rende più strong? L'aggiunta di un parametro di configurazione salt sembra come se avessi solo una chiave più lunga.
-
Qui mette alcuni dati casuali di fronte al dati reali. Se conoscessi i dati reali ({email: "[email protected]"}) ho pensato che sarebbe stato più facile indovinare il segreto. Questi dati casuali servono a proteggerli. Questo sale aiuta?
-
Qui ripete l'aes-256- CBS. È utile? La ripetizione rende il token finale più lungo (il che rende meno dati nell'URL), quindi questo è estraneo?
-
Qual è il modo migliore per rendere più complicato il calcolo, senza rendere il token più lungo?
-
C'è un modo per migliorare tutto ciò? O qualsiasi altra cosa che potrebbe essere rimossa.
Grazie! È il mio primo modulo incentrato sulla sicurezza, quindi volevo controllarlo in sicurezza.