Date post: | 20-Jul-2015 |
Category: |
Technology |
Upload: | jose-manuel-ortega-candel |
View: | 305 times |
Download: | 4 times |
Web Cryptography
José Manuel Ortega Candel | @jmortegac
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
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
Introducción
•Autenticación / Integridad
•Autorización / Identificación
•Encryption / Confidencialidad
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
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
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.
Demo localStorage https://github.com/jmortega/jsday.git
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
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)
AES
•Algoritmo de clave secreta compartida
•Simétrica •Misma clave para cifrar y desencriptar
•Tamaños de clave 128,192,256 bits
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)
AES en JavaScript
<script>
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); </script>
Crypto JS http://cryptojs.altervista.org
AES en JavaScript http://cryptojs.altervista.org/secretkey.html
RSA
• Algoritmo de clave publica / privada
•Asimétrica • Se encripta con la clave publica y se desencripta con la clave
privada
RSA en JavaScript
<script> 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); </script>
RSA en JavaScript http://cryptojs.altervista.org/publickey/rsa_st_stanford.html
Cryptico https://github.com/wwwtyro/cryptico
SHA-256 Cryptographic Hash Algorithm http://www.movable-type.co.uk/scripts/sha256.html
AES Advanced Encryption Standard
http://www.movable-type.co.uk/scripts/aes.html
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
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
Soporte en navegadores http://caniuse.com/#feat=cryptography
Soporte en navegadores https://sites.google.com/a/chromium.org/dev/blink/webcrypto
Web Cryptography API Live Table https://diafygi.github.io/webcrypto-examples
WebCrypto API https://developer.mozilla.org/en-US/docs/tag/Web%20Crypto%20API
window.crypto.subtle
Async calls + Promises
Chrome support WebCrypto API https://sites.google.com/a/chromium.org/dev/blink/webcrypto
WebCrypto API / RandomValues https://developer.mozilla.org/en-US/docs/DOM/window.crypto.getRandomValues
Examples WebCrypto API RSA Public/Private Key
Examples WebCrypto API Sign/Verify
Examples WebCrypto API Sign/Verify
Examples WebCrypto API Encrypt / Decrypt
Examples WebCrypto API Encrypt / Decrypt
Examples WebCrypto API Encrypt / Decrypt
Examples WebCrypto API
Examples WebCrypto API
•https://github.com/diafygi/webcrypto-examples
•https://github.com/nvdbleek/web-crypto-samples
PoliCrypt http://polycrypt.net https://github.com/polycrypt/polycrypt
Implementación de WebCrypto API
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
Librerías (independientes del Web Crypto API)
• crypto-js • Stanford Javascript Crypto Library • JavaScript Cryptography Toolkit • jsSHA • Gibberish-AES • jsAES • http://openpgpjs.org • pidCrypt
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
SJCL demo http://bitwiseshiftleft.github.io/sjcl/demo
Crypto-JS https://code.google.com/p/crypto-js
Ultima versión 3.1.2
Crypto-JS
Performance http://cryptojs.altervista.org/test/simulate-threading-speed_test.html
NodeJs Crypto http://nodejs.org/api/crypto.html
•require('crypto')
•Requiere instalar
OPENSSL en el servidor
NodeJs Crypto http://nodejs.org/api/crypto.html
JavaScript and Web Cryptography https://jswebcrypto.azurewebsites.net/demo.html
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
Mymail-Crypt for Gmail / Plugin para chrome
https://github.com/seancolyer/gmail-crypt
JavaScript Cryptography tools Plugin para chrome
Crypto Tools http://iblogbox.com/devtools/crypto
DuckDugGo Cryptography hacks
DuckDugGo Cryptography hacks
Telegram https://telegram.org
Open Source https://telegram.org/apps#source-code
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
Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib/crypto_worker.js
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; }
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; }
Telegram Security http://security.stackexchange.com/questions/49782/is-telegram-secure
Telegram JavaScript https://github.com/zhukov/webogram/tree/master/app/js/lib/mtproto.js
Telegram https://telegram.org/blog/cryptocontest
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
OWASP
•Organización que trata de mejorar la seguridad de las aplicaciones web
•Incluye una lista de las 10 vulnerabilidades más críticas
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
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);
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
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
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/14oTKnccypDRieszGLV7GbZXcIai0qLYOwgk_ELIj5A0/pubhtml
Coursera https://www.coursera.org/course/crypto
Thank you! José Manuel Ortega Candel | @jmortegac