full stack cryptography
TRANSCRIPT
“È fatta. Resta da cifrare un campo in una tabella, che sarà mai?”
Paolo Montrasio Giorgio [email protected] [email protected]
Il problema
Applicazione web conclusa
Bisogna cifrare un campo di testo nel DB
Il campo deve essere decifrabile nel client inserendo la chiave
Facile? Anche Ulisse deve aver detto così partendo da Troia
Alternative
Cifratura simmetrica con chiave sul server → inutile
Cifratura asimmetrica, solo chiave pubblica sul server → OK!
Alternative
Cifratura simmetrica con chiave sul server → inutile
Cifratura asimmetrica, solo chiave pubblica sul server → OK!
Ma…Si cifrano solo blocchi lunghi quanto la chiave
Meno il padding
I nostri dati sono brevi
Sarà una passeggiata!
I nostri dati sono brevi
Sarà una passeggiata!
Come mai le SELECT non funzionano!?
$ openssl genpkey -algorithm RSA -out private_key.pem \
-pkeyopt rsa_keygen_bits:2048
$ openssl rsa -pubout -in private_key.pem -out public_key.pem
$ nvm install 5.7.0
$ nvm use 5.7.0
https://github.com/pmontrasio/full-stack-cryptography
La crittografia non è
deterministica!
Ma possiamo far finta che lo sia
Padding deterministico in base ai dati Math.random() crypto.randomBytes()
JavaScript si è scordato di un Math.seed() → modulo esterno require(“seedrandom”)
La crittografia deterministica indebolisce la sicurezza
Usarla con cautela solo se necessario
Mandiamo i dati al browser
Base64!
Sembra fatta
Anche le cose più semplicinascondono sorprese
Interoperabilità con il backendBase64 Node → Base64 JS, OKBase64 Ruby → Base64 JS, un \n di troppo
Inserire la chiave privata nel browser, ogni volta: NO!
La seppelliamo in LocalStorage: NI
La sicurezza della crittografia JS nel frontend è dibattuta
È fatta o è un altro inganno?
Jsencrypt non decifra senza padding!
Cercare un altro modulo → non se ne trovano
Aggiungere la propria funzionedi decifratura → non una passeggiata
Dare la brutta notizia al cliente → qui è dove Ulisse ha perso tutti i compagni supestiti
Il codice da modificare è
di facile comprensione �
Scriviamo la funzione
Fork della libreria
https://github.com/pmontrasio/jsencrypt
E finalmente...
È ora di farla pagare!
È ora di farla pagare!
…la feature :)
Paolo Montrasio Giorgio [email protected] [email protected]@pmontrasio @ideaferace
https://github.com/pmontrasio/full-stack-cryptographySlide a https://connettiva.eu/full-stack-cryptography