Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Web Cryptography

Web Cryptography

Web Cryptography

jmortegac

May 10, 2015
Tweet

More Decks by jmortegac

Other Decks in Programming

Transcript

  1. Web Cryptography
    José Manuel Ortega Candel | @jmortegac

    View Slide

  2. 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

    View Slide

  3. 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

    View Slide

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

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  7. 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.

    View Slide

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

    View Slide

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

    View Slide

  10. 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

    View Slide

  11. 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)

    View Slide

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

    View Slide

  13. 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)

    View Slide

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

    View Slide

  15. Crypto JS
    http://cryptojs.altervista.org

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. Examples WebCrypto API
    RSA Public/Private Key

    View Slide

  32. Examples WebCrypto API
    Sign/Verify

    View Slide

  33. Examples WebCrypto API
    Sign/Verify

    View Slide

  34. Examples WebCrypto API
    Encrypt / Decrypt

    View Slide

  35. Examples WebCrypto API
    Encrypt / Decrypt

    View Slide

  36. Examples WebCrypto API
    Encrypt / Decrypt

    View Slide

  37. Examples WebCrypto API

    View Slide

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

    View Slide

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

    View Slide

  40. 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

    View Slide

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

    View Slide

  42. 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

    View Slide

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

    View Slide

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

    View Slide

  45. Crypto-JS

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. 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

    View Slide

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

    View Slide

  53. OpenPGP.js
    http://openpgpjs.org

    View Slide

  54. JavaScript Cryptography tools
    Plugin para chrome

    View Slide

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

    View Slide

  56. DuckDugGo
    Cryptography hacks

    View Slide

  57. DuckDugGo
    Cryptography hacks

    View Slide

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

    View Slide

  59. 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

    View Slide

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

    View Slide

  61. 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;
    }

    View Slide

  62. 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;
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  66. 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

    View Slide

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

    View Slide

  68. 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

    View Slide

  69. 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);

    View Slide

  70. 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

    View Slide

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

    View Slide

  72. 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

    View Slide

  73. 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

    View Slide

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

    View Slide

  75. Thank you!
    José Manuel Ortega Candel | @jmortegac

    View Slide