Full Stack Cryptography

Preview:

Citation preview

“È fatta. Resta da cifrare un campo in una tabella, che sarà mai?”

Paolo Montrasio Giorgio Sidaripaolo.montrasio@connettiva.eu giorgio@sidari.it

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 Sidaripaolo.montrasio@connettiva.eu giorgio@sidari.it@pmontrasio @ideaferace

https://github.com/pmontrasio/full-stack-cryptographySlide a https://connettiva.eu/full-stack-cryptography