Slide 1

Slide 1 text

Web Cryptography José Manuel Ortega Candel | @jmortegac

Slide 2

Slide 2 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 3

Slide 3 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 4

Slide 4 text

Introducción •Autenticación / Integridad •Autorización / Identificación •Encryption / Confidencialidad

Slide 5

Slide 5 text

Browser storage • Falta de funciones de criptografía que sean compatibles en todos los navegadores • Hay mucha tendencia a utilizar el localStorage del navegador y un posible atacante podría utilizar esta información para extraer el contenido que se va guardando

Slide 6

Slide 6 text

Protocolo HTTPS • La comunicación va cifrada, pero si sufrimos un ataque MITM y con las herramientas adecuadas(sniffers tipo wireshark),se puede llegar a ver los datos. •SSLStrip • Esta herramienta permite convertir el tráfico HTTPS en HTTP

Slide 7

Slide 7 text

Estado actual SSL •En realidad si usas SSL no sería necesario cifrar los datos, pero si sufres un ataque MITM los datos quedan expuestos a un posible atacante. •Sería recomendable añadir una capa más de seguridad con alguna librería de crypto en javascript.

Slide 8

Slide 8 text

Demo localStorage https://github.com/jmortega/jsday.git

Slide 9

Slide 9 text

Demo localStorage https://github.com/jmortega/jsday.git

Slide 10

Slide 10 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 11

Slide 11 text

Algoritmos •MD5, SHA-1,SHA-256,SHA-512 (Funciones hash) Comprobar la integridad de ficheros Firma de documentos •AES [Criptografía de clave privada][WPA2] •RSA-4096 [Criptografía de clave pública] •RC4(Usado en SSL)

Slide 12

Slide 12 text

AES •Algoritmo de clave secreta compartida •Simétrica •Misma clave para cifrar y desencriptar •Tamaños de clave 128,192,256 bits

Slide 13

Slide 13 text

AES •message = the unencrypted, readable data we care about. •cipherText = the message after encryption, the data the adversary gets to see. •Key = the secret required to encrypt and decrypt the message •Encryption: ciphertext = f(key, message) •Decryption: cleartext = f(key, cipherText)

Slide 14

Slide 14 text

AES en JavaScript var key = CryptoJS.enc.Hex.parse('01010101'); // clave var iv = Random();// Vector de inicialización var aesEncryptor = CryptoJS.AES.createEncryptor(key, { iv: iv }); var ciphertext = aesEncryptor.process("Message"); var aesDecryptor = CryptoJS.AES.createDecryptor(key, { iv: iv }); var plaintext = aesDecryptor.process(ciphertext);

Slide 15

Slide 15 text

Crypto JS http://cryptojs.altervista.org

Slide 16

Slide 16 text

AES en JavaScript http://cryptojs.altervista.org/secretkey.html

Slide 17

Slide 17 text

RSA • Algoritmo de clave publica / privada •Asimétrica • Se encripta con la clave publica y se desencripta con la clave privada

Slide 18

Slide 18 text

RSA en JavaScript var KeySize=512; var RSAkey = CryptoJS.generateRSAKey(“PassPhrase”, KeySize); var PublicKey = CryptoJS.publicKeyString(RSAkey); var PrivateKey = CryptoJS.privateKeyString(RSAkey); var Encryption = CryptoJS.encrypt(“Message”, PublicKey); var Decryption = CryptoJS.decrypt(Encryption.cipherText, PrivateKey);

Slide 19

Slide 19 text

RSA en JavaScript http://cryptojs.altervista.org/publickey/rsa_st_stanford.html

Slide 20

Slide 20 text

Cryptico https://github.com/wwwtyro/cryptico

Slide 21

Slide 21 text

SHA-256 Cryptographic Hash Algorithm http://www.movable-type.co.uk/scripts/sha256.html

Slide 22

Slide 22 text

AES Advanced Encryption Standard http://www.movable-type.co.uk/scripts/aes.html

Slide 23

Slide 23 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 24

Slide 24 text

WebCrypto API http://www.w3.org/TR/WebCryptoAPI •Esta especificación describe un API para realizar operaciones criptográficas. •Funciones hash •Algoritmos de clave pública y privada •Generación de firmas y verificación de datos •Cifrado y descifrado de mensajes

Slide 25

Slide 25 text

Soporte en navegadores http://caniuse.com/#feat=cryptography

Slide 26

Slide 26 text

Soporte en navegadores https://sites.google.com/a/chromium.org/dev/blink/webcrypto

Slide 27

Slide 27 text

Web Cryptography API Live Table https://diafygi.github.io/webcrypto-examples

Slide 28

Slide 28 text

WebCrypto API https://developer.mozilla.org/en-US/docs/tag/Web%20Crypto%20API window.crypto.subtle Async calls + Promises

Slide 29

Slide 29 text

Chrome support WebCrypto API https://sites.google.com/a/chromium.org/dev/blink/webcrypto

Slide 30

Slide 30 text

WebCrypto API / RandomValues https://developer.mozilla.org/en-US/docs/DOM/window.crypto.getRandomValues

Slide 31

Slide 31 text

Examples WebCrypto API RSA Public/Private Key

Slide 32

Slide 32 text

Examples WebCrypto API Sign/Verify

Slide 33

Slide 33 text

Examples WebCrypto API Sign/Verify

Slide 34

Slide 34 text

Examples WebCrypto API Encrypt / Decrypt

Slide 35

Slide 35 text

Examples WebCrypto API Encrypt / Decrypt

Slide 36

Slide 36 text

Examples WebCrypto API Encrypt / Decrypt

Slide 37

Slide 37 text

Examples WebCrypto API

Slide 38

Slide 38 text

Examples WebCrypto API • https://github.com/diafygi/webcrypto-examples • https://github.com/nvdbleek/web-crypto-samples

Slide 39

Slide 39 text

PoliCrypt http://polycrypt.net https://github.com/polycrypt/polycrypt Implementación de WebCrypto API

Slide 40

Slide 40 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 41

Slide 41 text

Librerías (independientes del Web Crypto API) • crypto-js • Stanford Javascript Crypto Library • JavaScript Cryptography Toolkit • jsSHA • Gibberish-AES • jsAES • http://openpgpjs.org • pidCrypt

Slide 42

Slide 42 text

SJCL http://crypto.stanford.edu/sjcl •http://bitwiseshiftleft.github.io/sjcl/ •http://bitwiseshiftleft.github.io/sjcl/browserTest • Soporte AES • Key 128, 192 or 256 bits

Slide 43

Slide 43 text

SJCL demo http://bitwiseshiftleft.github.io/sjcl/demo

Slide 44

Slide 44 text

Crypto-JS https://code.google.com/p/crypto-js Ultima versión 3.1.2

Slide 45

Slide 45 text

Crypto-JS

Slide 46

Slide 46 text

Performance http://cryptojs.altervista.org/test/simulate-threading-speed_test.html

Slide 47

Slide 47 text

Crypto-js demo http://jsfiddle.net/Z583W

Slide 48

Slide 48 text

NodeJs Crypto http://nodejs.org/api/crypto.html •require('crypto') •Requiere instalar OPENSSL en el servidor

Slide 49

Slide 49 text

NodeJs Crypto http://nodejs.org/api/crypto.html

Slide 50

Slide 50 text

JavaScript and Web Cryptography https://jswebcrypto.azurewebsites.net/demo.html

Slide 51

Slide 51 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 52

Slide 52 text

Mymail-Crypt for Gmail / Plugin para chrome https://github.com/seancolyer/gmail-crypt

Slide 53

Slide 53 text

OpenPGP.js http://openpgpjs.org

Slide 54

Slide 54 text

JavaScript Cryptography tools Plugin para chrome

Slide 55

Slide 55 text

Crypto Tools http://iblogbox.com/devtools/crypto

Slide 56

Slide 56 text

DuckDugGo Cryptography hacks

Slide 57

Slide 57 text

DuckDugGo Cryptography hacks

Slide 58

Slide 58 text

Telegram https://telegram.org Open Source https://telegram.org/apps#source-code

Slide 59

Slide 59 text

Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib AES, SHA-1 implementation •https://code.google.com/p/crypto-js  RSA implementation •http://www-cs-students.stanford.edu/~tjw/jsbn

Slide 60

Slide 60 text

Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib/crypto_worker.js

Slide 61

Slide 61 text

Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib/bin_utils.js function aesEncryptSync (bytes, keyBytes, ivBytes) { var len = bytes.byteLength || bytes.length; bytes = addPadding(bytes); var encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), { iv: bytesToWords(ivBytes), padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.IGE }).ciphertext; var encryptedBytes = bytesFromWords(encryptedWords); // console.log(dT(), 'AES encrypt finish'); return encryptedBytes; }

Slide 62

Slide 62 text

Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib/bin_utils.js function aesDecryptSync (encryptedBytes, keyBytes, ivBytes) { // console.log(dT(), 'AES decrypt start', encryptedBytes.length); var decryptedWords = CryptoJS.AES.decrypt({ciphertext: bytesToWords(encryptedBytes)}, bytesToWords(keyBytes), { iv: bytesToWords(ivBytes), padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.IGE }); var bytes = bytesFromWords(decryptedWords); // console.log(dT(), 'AES decrypt finish'); return bytes; }

Slide 63

Slide 63 text

Telegram Security http://security.stackexchange.com/qu estions/49782/is-telegram-secure

Slide 64

Slide 64 text

Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib/mtproto.js

Slide 65

Slide 65 text

Telegram https://telegram.org/blog/cryptocontest

Slide 66

Slide 66 text

INDEX • Introducción a la seguridad en aplicaciones web • Almacenamiento en navegador • Encriptado y desencriptado de la información con JavaScript • Web Cryptography API y soporte para navegadores • Librerías que permiten usar la mayoría de los algoritmos de cifrado(CryptoJS,SJCL) • Tools • OWASP guide

Slide 67

Slide 67 text

OWASP •Organización que trata de mejorar la seguridad de las aplicaciones web •Incluye una lista de las 10 vulnerabilidades más críticas

Slide 68

Slide 68 text

OWASP Top 10 Risks Vulnerabilidades • 1. SQL Injection • 2. Broken auth and session management • 3. Cross-site scripting(XSS) • 4. Insecure direct object references • 5. Security misconfiguration • 6. Sensitive data exposure • 7. Missing function level access control • 8. Cross-site request forgery(CSRF) • 9. Using vulnerable components • 10. Unvalidated redirects and forwards

Slide 69

Slide 69 text

SQL injection • Inyectar parámetros en la cadena que realiza la consulta. • Permitir a un atacante ejecutar código de forma arbitraria en el servidor. •Solución : Prepared statements $stmt = $mysqli->prepare( 'UPDATE users SET email = ? where id = 123'); $stmt->bind_param('s',$email);

Slide 70

Slide 70 text

Cross Site Scripting(XSS) •Inyectar código malicioso mediante javascript •Solución : Validar entradas mediante expresiones regulares •Validar que no estén modificando las cabeceras de la peticiones •Emplear frameworks que permitan el filtrado y la validación de los datos de entrada

Slide 71

Slide 71 text

Anti-XSS https://noscript.net •Extensión para firefox para evitar ataques XSS

Slide 72

Slide 72 text

Cross Site Request Forgery(CSRF) •Recoger credenciales del usuario que se envían por GET •Secuestrar cookies para utilizar una sesión con fines maliciosos •Emplear POST para enviar las peticiones y cifrar los datos más sensibles(login) •Emplear tokens de autenticación

Slide 73

Slide 73 text

Resources • https://www.owasp.org/index.php/Guide_to_Cryptography • http://www.w3.org/TR/WebCryptoAPI • Symmetric Cryptography in Javascript • http://bitwiseshiftleft.github.io/sjcl/acsac.pdf • http://seclab.stanford.edu • http://www.w3.org/2001/tag/doc/web-https-2015-01-22 • https://docs.google.com/spreadsheets/d/14oTKnccypDRiesz GLV7GbZXcIai0qLYOwgk_ELIj5A0/pubhtml

Slide 74

Slide 74 text

Coursera https://www.coursera.org/course/crypto

Slide 75

Slide 75 text

Thank you! José Manuel Ortega Candel | @jmortegac