php identity and data security

41
PHP Identity and Data Security Jonathan LeBlanc Twitter: @jcleblanc Book: http://bit.ly/iddatasecurity

Upload: jonathan-leblanc

Post on 13-Apr-2017

1.952 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: PHP Identity and Data Security

PHP Identity and Data Security !

Jonathan LeBlanc !Twitter: @jcleblanc !Book: http://bit.ly/iddatasecurity!

Page 2: PHP Identity and Data Security

Release Date: !July 2016 !!Book Details: !http://bit.ly/iddatasecurity!

Identity & Data Security Book!

Page 3: PHP Identity and Data Security

Security is Hard !

Page 4: PHP Identity and Data Security

1: 123456 !2: password !3: 12345678 !4: qwerty !5: 12345 !6: 123456789 !7: football!8: 1234 !9: 1234567 !

Top Passwords of 2015!

10: baseball!11: welcome!12: 1234567890 !13: abc123 !14: 111111 !15: 1qaz2wsx !16: dragon!17: master!

18: monkey!19: letmein!20: login!21: princess!22: qwertyuiop!23: solo !24: passw0rd !25: starwars!

Page 5: PHP Identity and Data Security
Page 6: PHP Identity and Data Security

Protecting Identity !

Page 7: PHP Identity and Data Security

Password Attack Vectors !

Page 8: PHP Identity and Data Security

Brute Force Attacks!Calculate all key variations within a given length, then trying each one until the password is guessed. !Protect via: Key stretching, CAPTCHA, 2FA !!Dictionary Attacks!Use a list of predetermined words/phrase to guess password. !Protect via: Salting!!Rainbow Tables!Use precalculated password hashes to break encryption. !Protect via: Salting !

Protecting Against Password Attacks!

Page 9: PHP Identity and Data Security

Salting and Peppering !

Page 10: PHP Identity and Data Security

//hashing identical messages with no salt !hash('mechagodzilla') = ! 162e0a91026a28f1f2afa11099d1fcbdd9f2e351095ebb196c90e10290ef1227 !hash('mechagodzilla') = ! 162e0a91026a28f1f2afa11099d1fcbdd9f2e351095ebb196c90e10290ef1227 !!//hashing identical messages with random salt !hash('mechagodzilla' + '458cf2979ef27397db67077775225334') = ! f3499a916612e285612b32702114751f557a70606c32b54b92de55153d40d3b6 !hash('mechagodzilla' + 'ef5b72eff781b09a0784438af742dd6e') = ! 7e29c5c48f44755598dec3549155ad66f1af4671091353be4c4d7694d71dc866 !hash('mechagodzilla' + 'cc989b105a1c6a5f0fb460e29dd272f3') = ! 6dedd3dbb0639e6e00ca0bf6272c141fb741e24925cb7548491479a1df2c215e!

Hashing with and without salts!

Page 11: PHP Identity and Data Security

Storing Salts!Store alongside the hash!

!Salt Reuse!Salts should be be unique per password!

!Salt Length!Same size as hash? 64 bits? 128 bits? !

Considerations when using Salts!

Page 12: PHP Identity and Data Security

bcrypt!Designed for password security, based on the blowfish cipher, CPU & RAM intensive. !!PBKDF2 !Comes from RSA laboratories, performs the HMAC (hash + key) over a specific number of iterations. !!scrypt!Designed to make it costly to perform large-scale hardware attacks by requiring large amounts of memory!

Password Encryption Algorithms!

Page 13: PHP Identity and Data Security

!//fetch password from user creation request!$password = $_POST['password']; !!//salt option deprecated in PHP 7.0.0+ !$options = [ ! 'cost' => 12 !]; !!//create 60 character hash, with default unique salt, and options !$hash = password_hash($password, PASSWORD_BCRYPT, $options); !!//STORE HASH IN USER DATABASE RECORD !//SALT IS BUILT INTO HASH!

Hashing with bcrypt!

Page 14: PHP Identity and Data Security

//fetch login request information!$username = $_POST['username']; !$password = $_POST['password']; !!//fetch user record from database!$user = fetchDBRecord($username); !!//verify if login attempt password matches stored user hash!if (password_verify($password, $user->hash)){ ! echo "password matches"; !} else { ! echo "password doesn't match"; !} !

Login Hash Comparison with bcrypt!

Page 15: PHP Identity and Data Security

!!//fetch password from user creation request!$password = $_POST['password']; !!//set iterations and random initialization vector!$iterations = 1000; !$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); !!//hash password using sha256 !$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20); !!//STORE HASH AND SALT IN USER DATABASE RECORD !

Hashing with PBKDF2!

Page 16: PHP Identity and Data Security

!//fetch login request info and set iterations!$username = $_POST['username']; !$password = $_POST['password']; !$iterations = 1000; !!//fetch user record from database!$user = fetchDBRecord($username); !!//manually hash the login attempt password!$loginhash = hash_pbkdf2("sha256", $password, $user->salt, $iterations, 20); !!//validate if hashes match!if (hash_equals ($loginhash, $user->hash)){ ! echo 'password match'; !} else { ! echo 'password mismatch'; !} !!

Login Hash Comparison with PBKDF2!

Page 17: PHP Identity and Data Security

Protecting Data !

Page 18: PHP Identity and Data Security

Ideal Scenario: SSL/TLS !

Page 19: PHP Identity and Data Security

Domain Validation (DV) !Certificate authority (CA) validates domain access only!

Certificate Types!

Page 20: PHP Identity and Data Security

Organization Validation (OV) !!CA validates DV and basic organization information!

Certificate Types!

Page 21: PHP Identity and Data Security

Extended Validation (EV) !CA validates DV, OV, and legal existance of the organization!

Certificate Types!

Page 22: PHP Identity and Data Security
Page 23: PHP Identity and Data Security

//generate private key and self-signed certificate valid for 1 year !openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt!

Generate your self-signed certificate and private key!

Page 24: PHP Identity and Data Security

//update httpd.conf file to enable SSL (uncomment the following) !#LoadModule ssl_module libexec/apache2/mod_ssl.so!#Include /private/etc/apache2/extra/httpd-ssl.conf!!//update httpd-ssl.conf file for CRT location !SSLCertificateFile "/private/etc/apache2/server.crt" !!//copy crt and private key files to above location !cp server.crt server.key /private/etc/apache2/ !

Configuring SSL capabilities and setting certificates on Apache server!

Page 25: PHP Identity and Data Security

<VirtualHost *:443> ! #general virtual hosts information ! DocumentRoot "/Users/jleblanc/localhost/ssltest" ! ServerName ssltest! ErrorLog "/private/var/log/apache2/local.example.com-error_log" ! CustomLog "/private/var/log/apache2/local.example.com-access_log" common !! #SSL details ! SSLEngine on ! SSLCertificateFile "/private/etc/apache2/server.crt” ! SSLCertificateKeyFile "/private/etc/apache2/server.key" !! #SSL engine options ! <FilesMatch "\.(cgi|shtml|phtml|php)$"> ! SSLOptions +StdEnvVars! </FilesMatch> ! <Directory "/Library/WebServer/CGI-Executables"> ! SSLOptions +StdEnvVars! </Directory> !</VirtualHost> !

Update httpd-vhosts.conf!

Page 26: PHP Identity and Data Security
Page 27: PHP Identity and Data Security

Synchronous Cryptography !

Page 28: PHP Identity and Data Security
Page 29: PHP Identity and Data Security

Single User Environment !

Page 30: PHP Identity and Data Security

Encryption (ECB, CBC, OFB, CFB, CTR) !Data privacy and confidentiality mode. Attacker cannot obtain info on the plaintext data. !!Authentication(CMAC) !Data authenticity mode. Receiver can validate whether cleartext came from intended sender. !!Authenticated Encryption (CCM, GCM, KW/KWP/TKW) !Includes both data privacy and authenticity. !

Modes of Operation!

Page 31: PHP Identity and Data Security

//set initialization data !$numbytes = 16; !$strongcrypto = true; !$mode = 'aes-256-cbc'; !$message = 'my secure message'; !!//creation initialization vector and shared private key !$iv = openssl_random_pseudo_bytes($numbytes, $strongcrypto); !$key = openssl_random_pseudo_bytes($numbytes, $strongcrypto); !!//create ciphertext with no options !$ciphertext = openssl_encrypt($message, $mode, $key, 0, $iv); !

Configuring and encrypting message!

Page 32: PHP Identity and Data Security

//---- !// data sent to server: iv, ciphertext!// data known by server: key !//---- !!//set algorithm and mode !$mode = 'aes-256-cbc’;!!//decrypt provided cipher !$decrypted = openssl_decrypt($ciphertext, $mode, $key, 0, $iv);!

Decrypting ciphertext!

Page 33: PHP Identity and Data Security

//display block ciphers and modes !print_r(openssl_get_cipher_methods());!

Getting all available ciphers and modes !

Page 34: PHP Identity and Data Security

Asynchronous Cryptography !

Page 35: PHP Identity and Data Security
Page 36: PHP Identity and Data Security

Multi-User Environment !

Page 37: PHP Identity and Data Security

//create private key in private.key!openssl genrsa -out private.key 2048 !!//create public key in public.pem!openssl rsa -in private.key -outform PEM -pubout -out public.pem!

Generating Public / Private Keys!

Page 38: PHP Identity and Data Security

//set public key data from files and object to send !$public_key = openssl_get_publickey(file_get_contents('public.pem')); !$data = '{"message": "my super secure message"}'; !!//encrypt object and public keys!openssl_seal($data, $encrypted, $encpub, array($public_key)); !!//encrypted data and encrypted public key !$sealed_data = base64_encode($encrypted); !$envelope = base64_encode($encpub[0]); !!//SEND SEALED DATA AND ENVELOPE TO RECIPIENT !

Preparing Message, Encrypting, and Signing!

Page 39: PHP Identity and Data Security

//OBTAIN SEALED DATA AND ENVELOPE FROM SENDER !!//set private key data !$private_key = openssl_get_privatekey(file_get_contents('private.key'));!!//decode data !$sealed_data = base64_decode($sealed_data); !$envelope = base64_decode($envelope); !!//rypt data using private key !openssl_open($sealed_data, $plaintext, $envelope, $private_key); !!//decrypted message available in $plaintext!

Decrypting and Verifying Message!

Page 40: PHP Identity and Data Security

Security Fundamentals Wrapup!

Page 41: PHP Identity and Data Security

Thank You! !

Jonathan LeBlanc !Twitter: @jcleblanc !Book: http://bit.ly/iddatasecurity!