cryptography for the average developer

54
Cryptography In PHP For The Average Developer

Upload: anthony-ferrara

Post on 01-Sep-2014

1.576 views

Category:

Technology


3 download

DESCRIPTION

This talk was presented at Day Camp for Developers Master Series 2012

TRANSCRIPT

Page 1: Cryptography For The Average Developer

CryptographyIn PHP

For The Average Developer

Page 2: Cryptography For The Average Developer

Cryptography● Keeping Data Secure

○ Safe From Viewing○ Safe From Tampering○ Safe From Forgery

● Not A Silver Bullet○ XSS○ SQLI○ Social Engineering

● Very Hard To Do○ Any bug will cause problems

Page 3: Cryptography For The Average Developer

The First Ruleof Cryptography

Page 4: Cryptography For The Average Developer

Don't Do It!

Page 5: Cryptography For The Average Developer

Leave ItFor

Experts

Page 6: Cryptography For The Average Developer

Random!The Foundation of Cryptography

● Classified Under Three Types:○ Weak

■ For non-cryptographic usages○ Strong

■ For cryptographic usages where security does not depend on the strength of randomness

○ Cryptographically Secure■ For cryptographic usage when security does

depend on the strength of randomness

Page 7: Cryptography For The Average Developer

Vulnerabilities of Randomness

● Bias○ Certain values tend to occur more often making it

easier to predict future numbers● Predictability

○ Knowing past numbers helps predict future numbers

● Poisoning○ Ability to alter future random number generation

Page 8: Cryptography For The Average Developer

Weak Random in PHPNot to be used for cryptographic usages!!!

● rand()● mt_rand()● uniqid()● lcg_value()

Page 9: Cryptography For The Average Developer

Strong Random in PHP

● mcrypt_create_iv()○ MCRYPT_DEV_URANDOM

● openssl_random_pseudo_bytes()

● /dev/urandom○ For *nix systems only

Page 10: Cryptography For The Average Developer

Cryptographically Secure

● mcrypt_create_iv()○ MCRYPT_DEV_RANDOM

● openssl_random_pseudo_bytes()○ Maybe

● /dev/random○ For *nix systems only

Page 11: Cryptography For The Average Developer

NEVERUse Weak

For Security

Page 12: Cryptography For The Average Developer

NEVERUse CS

When Not Needed

Page 13: Cryptography For The Average Developer

If In DoubtUse Strong

Randomness

Page 14: Cryptography For The Average Developer

Encryption vs Hashing

● Encryption○ Encoding○ 2 Way / Reversible○ Putting a lock on a box

● Hashing○ Signing○ 1 Way / Non-Reversible○ Taking a person's finger-print

Page 15: Cryptography For The Average Developer

Encryption

Page 16: Cryptography For The Average Developer

Seriously,Don't Do It!

Page 17: Cryptography For The Average Developer

Terms

● Key○ Secure string of data

● Plain-Text○ The text you want to keep secret

● Cipher-Text○ The encrypted output

Page 18: Cryptography For The Average Developer

Two Basic Types

● Symmetric Encryption○ Like a Pad-Lock with a shared key○ The only secret is the key○ Both sides must have the same key

● Asymmetric Encryption○ Like a pair of Pad-Locks

■ The "lock" is the public key○ The only secret is the private key○ Both sides have their own key

Page 19: Cryptography For The Average Developer

Symmetric Encryption 101

● Number:01

Scratch That

● Numbers:01 04 01 54 95 42 64 12

Page 20: Cryptography For The Average Developer

Symmetric Encryption 101Let's Add A "Secret" Number!

01 04 01 54 95 42 64 12

+10

11 14 11 64 05 52 74 22

Page 21: Cryptography For The Average Developer

Secret Numbers

● We just invented the Caesar Cipher○ Commonly known as "ROT13"

● But There Are Problems:○ Vulnerable To Statistical Attacks○ Vulnerable To Brute Forcing

■ Only 100 possible secret numbers!

Page 22: Cryptography For The Average Developer

Symmetric Encryption 101I Know: Let's Add A Different Number!

01 04 01 54 95 42 64 12

+10 43 21 95 42 67 31 83

11 47 22 49 37 09 95 95

Page 23: Cryptography For The Average Developer

How It WorksWe can generate the pads in two ways● Randomly

○ If we only use once, perfect security■ Known as a one-time-pad

○ If we use multiple times, same as caesar cipher

● With A Function○ Give one or two inputs

■ A key, and an "input"○ Generates a "stream" of pseudo random

numbers

Page 24: Cryptography For The Average Developer

Ciphers● Take 2 inputs

○ A secret key○ An "input"

● Produces Pseudo-Random Output○ Looks random (statistically)○ Is deterministic

■ Reproducible given same inputs

Page 25: Cryptography For The Average Developer

Modes● Multiple ways to use the keystream

● Each way is known as a "Mode"

● Some are secure○ Others are not

Page 26: Cryptography For The Average Developer

ECBElectronic Code Book

● Uses plain-text as "input"

● Uses output as cipher-text

● VERY BROKEN!!!

Page 27: Cryptography For The Average Developer

ECB

Page 28: Cryptography For The Average Developer

CBCCipher Block Chaining● Uses an "Initialization Vector"

○ Helps "randomize" the plain-text○ Ensures no non-unique blocks○ Does NOT need to be secret

● Chains each block together○ Propagating the generated "randomness"

● Plain-Text Must Be Padded○ To a multiple of block-size

● Secure!

Page 29: Cryptography For The Average Developer

CBC

Page 30: Cryptography For The Average Developer

CFBCipher FeedBack● Uses an "Initialization Vector"

● Plain-Text never enters cipher○ Does not need to be padded

● "Decrypt" Is Never Used

● Secure!

Page 31: Cryptography For The Average Developer

CFB

Page 32: Cryptography For The Average Developer

Ciphers● AES 128 & 256

○ Standard■ NIST Approved

○ Also Known As RIJNDAEL-128■ 128 here refers to "block size"

○ Very Strong○ Note, the number after AES is *key size*

● Blowfish● TwoFish● Serpent

Page 33: Cryptography For The Average Developer

AuthenticationHow do you know it wasn't tampered with / came from your friend?● HMAC

○ Hash-based Message Authentication Code● USE A SEPARATE KEY!● Encrypt-Then-MAC

○ Always MAC after encryption

Page 34: Cryptography For The Average Developer

All Together Now!

Page 35: Cryptography For The Average Developer

Encrypt$key = 'xxxxxxxxxxxxxxxx';

$authKey = 'XXXXXXXXXXXXXX';

$plain = 'This is plain text that I am going to encrypt';

$size = mcrypt_get_iv_size(

MCRYPT_RIJNDAEL_128,

MCRYPT_MODE_CFB

);

$iv = mcrypt_create_iv(

$size,

MCRYPT_DEV_URANDOM

);

$cipherText = mcrypt_encrypt( MCRYPT_RIJNDAEL_128,

$key,

$plain,

MCRYPT_MODE_CFB,

$iv

);

$auth = hash_hmac('sha512', $cipherText, $authKey, true);

$encrypted = base64_encode($iv . $cipherText . $auth);

Page 36: Cryptography For The Average Developer

Decrypt$key = 'xxxxxxxxxxxxxxxx';

$authKey = 'XXXXXXXXXXXXXX';

$size = mcrypt_get_iv_size(

MCRYPT_RIJNDAEL_128,

MCRYPT_MODE_CFB

);

$encrypted = base64_decode($encrypted);

$iv = substr($encrypted, 0, $size);

$auth = substr($encrypted, -64);

$cipherText = substr($encrypted, $size, -64);

if ($auth != hash_hmac('sha512', $cipherText, $authKey, true)) {

// Auth Failed!!!

return false;

}

$plainText = mcrypt_decrypt( MCRYPT_RIJNDAEL_128,

$key,

$cipherText,

MCRYPT_MODE_CFB,

$iv

);

Page 37: Cryptography For The Average Developer

Please Don't Do It!● Notice How Much Code It Took○ Without error checking

● Notice How Complex It Is○ Without flexibility

● Notice How Easy To Screw Up○ Without Key Storage

● Notice How Many Decisions To Make

Page 38: Cryptography For The Average Developer

If you MUST,Use a Library

Page 39: Cryptography For The Average Developer

Common Encryption Needs

● Between Client / Server○ Use SSL○ Really, just use SSL○ I'm not kidding, just use SSL

● Storage○ Use disk encryption○ Use database encryption

Page 40: Cryptography For The Average Developer

Really,Don't Do It!

Page 41: Cryptography For The Average Developer

Encryption Resources● Zend Framework Encryption○ Very good and complete lib○ ZF2■ Zend\Crypt\BlockCipher

● PHP Sec Lib○ phpseclib.sourceforge.net○ Pure PHP

● Not Many Others○ Beware of online tutorials!!!

Page 42: Cryptography For The Average Developer

PasswordStorage

Page 43: Cryptography For The Average Developer

PasswordsShould BeHASHED!

Not Encrypted!

Page 44: Cryptography For The Average Developer

Password Hashes● Use A Salt○ Defeats Rainbow Tables○ Makes Each Hash a "Proof Of Work"○ Should be random!■ Strong Randomness

● Should Be SLOW!○ Salt is not enough○ Salted SHA256: 11 BILLION per second○ bcrypt: 3200 per second

Page 45: Cryptography For The Average Developer

Good Algorithms

crypt($password, $salt);pbkdf2($password, $salt, $i);password_hash( $password, PASSWORD_BCRYPT);$passLib->hash($password);$phpass->hashPassword($pass);

Page 46: Cryptography For The Average Developer

Cost Parameter● Target: 0.25 - 0.5 Seconds○ As slow as you can afford

● Depends on hardware○ Test it!

● Good Defaults:○ BCrypt: 10○ PBKDF2: 10,000

Page 47: Cryptography For The Average Developer

SimplifiedPasswordHashing

Page 48: Cryptography For The Average Developer

New API for 5.5● string password_hash($pass, $algo, array $options =

array())

○ Generates Salt, hashes password

● bool password_verify($pass, $hash)○ Verifies Hash with Password

● bool password_needs_rehash($hash, $algo, array $options = array())

○ Determines if the hash is the same as specified by algo and options

● array password_get_info($hash)○ Returns information about the hash

Page 49: Cryptography For The Average Developer

Examplefunction register($user, $password) { $hash = password_hash($password, PASSWORD_BCRYPT); $this->store($user, $hash);}

function login($user, $password) { $hash = $this->fetchHash($user); if (password_verify($password, $hash)) { if (password_needs_rehahs($hash, PASSWORD_BCRYPT)) { $hash = password_hash($password, PASSWORD_BCRYPT); $this->store($user, $hash); } $this->startSession(); return true; } return false;}

Page 50: Cryptography For The Average Developer

Hashing Resources● PHP 5.5 API

○ wiki.php.net/rfc/password_hash● Password Compat

○ PHP 5.5 Compatibility○ github/ircmaxell/password_compat

● PasswordLib○ 5.3+, Multiple Algorithms, Portable○ github/ircmaxell/PHP-PasswordLib

● PHPASS○ PHP 4+○ openwall.com/phpass

Page 51: Cryptography For The Average Developer

Seriously,Hire an Expert!

Page 52: Cryptography For The Average Developer

You Have BeenWarned

Page 53: Cryptography For The Average Developer

Questions?

Comments?

Snide Remarks?

Page 54: Cryptography For The Average Developer

Anthony Ferrara@ircmaxell

[email protected]

joind.in/7939