24
“È fatta. Resta da cifrare un campo in una tabella, che sarà mai?” Paolo Montrasio Giorgio Sidari [email protected] [email protected]

Full Stack Cryptography

Embed Size (px)

Citation preview

Page 1: Full Stack Cryptography

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

Paolo Montrasio Giorgio [email protected] [email protected]

Page 2: Full Stack Cryptography

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

Page 3: Full Stack Cryptography

Alternative

Cifratura simmetrica con chiave sul server → inutile

Cifratura asimmetrica, solo chiave pubblica sul server → OK!

Page 4: Full Stack Cryptography

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

Page 5: Full Stack Cryptography

I nostri dati sono brevi

Sarà una passeggiata!

Page 6: Full Stack Cryptography

I nostri dati sono brevi

Sarà una passeggiata!

Come mai le SELECT non funzionano!?

Page 7: Full Stack Cryptography

$ 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

Page 8: Full Stack Cryptography
Page 9: Full Stack Cryptography

La crittografia non è

deterministica!

Page 10: Full Stack Cryptography

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”)

Page 11: Full Stack Cryptography
Page 12: Full Stack Cryptography

La crittografia deterministica indebolisce la sicurezza

Usarla con cautela solo se necessario

Page 13: Full Stack Cryptography

Mandiamo i dati al browser

Base64!

Sembra fatta

Page 14: Full Stack Cryptography

Anche le cose più semplicinascondono sorprese

Interoperabilità con il backendBase64 Node → Base64 JS, OKBase64 Ruby → Base64 JS, un \n di troppo

Page 15: Full Stack Cryptography

Inserire la chiave privata nel browser, ogni volta: NO!

La seppelliamo in LocalStorage: NI

La sicurezza della crittografia JS nel frontend è dibattuta

Page 16: Full Stack Cryptography
Page 17: Full Stack Cryptography

È fatta o è un altro inganno?

Page 18: Full Stack Cryptography

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

Page 19: Full Stack Cryptography

Il codice da modificare è

di facile comprensione �

Scriviamo la funzione

Page 20: Full Stack Cryptography

Fork della libreria

https://github.com/pmontrasio/jsencrypt

Page 21: Full Stack Cryptography

E finalmente...

Page 22: Full Stack Cryptography

È ora di farla pagare!

Page 23: Full Stack Cryptography

È ora di farla pagare!

…la feature :)

Page 24: Full Stack Cryptography

Paolo Montrasio Giorgio [email protected] [email protected]@pmontrasio @ideaferace

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