@adam_englander
PHP[TEK] 2018
Wifi:
Sheraton Conference
Pass: phptek2018
Twitter:
#phptek
Rate the Talks
https://joind.in/event/phptek-2018
@adam_englander
Cryptography Advances
in PHP 7.2
Adam Englander
Software Architect, iovation
@adam_englander
Half of the changes identified in the
PHP7.2.0 release announcements
were related to cryptography.
@adam_englander
SSL is Dead!
Long live TLS!
@adam_englander
Streams
ssl:// is now an alias of tls://
@adam_englander
Steam Defaults
STREAM_CRYPTO_METHOD_TLS_SERVER,
STREAM_CRYPTO_METHOD_TLS_CLIENT,
and tls:// default to
TLSv1.0 + TLSv1.1 + TLSv1.2
Instead of TLSv1.0 only
@adam_englander
Goodbye MCrypt!
@adam_englander
@adam_englander
Hello NaCl!
(Sodium)
@adam_englander
Easy, Secure, and Fast
@adam_englander
Easy Like Laravel
@adam_englander
Opinionated for your pleasure
@adam_englander
Simplifies Common Tasks
@adam_englander
Does a Lot of Heavy Lifting
@adam_englander
Secure Like the Phantom Zone
@adam_englander
Strong Authenticated Encryption
@adam_englander
Modern Algorithms
Poly1305
XSalsa20ChaCha20
Argon2i
Blake2
@adam_englander
Helpers for Security
@adam_englander
Constant-Time Test for Equality
"abcdefg" == "hijklmnop"
sodium_memcmp("abcdefg", "hijklmnop")
"abcdefg" == "abcdefq"
sodium_memcmp("abcdefg", "abcdefq")
@adam_englander
String Memory Overwrite
sodium_memzero($value);
$value = "000000";
$value = "secret";
@adam_englander
Fast Like the Millennium Falcon
@adam_englander
ChaCha20 vs AES
https://security.googleblog.com/2014/04/speeding-up-and-strengthening-https.html
@adam_englander
BLAKE2 vs Everything
https://blake2.net/
@adam_englander
Key Derivation
a.k.a. password hashing
@adam_englander
Argon2i
@adam_englander
Best in Class
@adam_englander
Blake2 Inside
@adam_englander
Time based rather count based
iterations
@adam_englander
Parallelism and Memory
Requirements
@adam_englander
Exposed via Password Function
@adam_englander
scrypt without PECL
@adam_englander
Hashing
Generic hashing
@adam_englander
Blake2b for data validation
@adam_englander
SipHash-2-4 for short hashes
@adam_englander
Symmetric Key Encryption
a.k.a secret key encryption
@adam_englander
Authenticated encryption via
auth tag
@adam_englander
Stream based encryption
@adam_englander
Encrypted message sets
@adam_englander
XSalsa20-Poly1305
@adam_englander
AES256-GCM if you like pain
@adam_englander
Asymmetric Key Cryptography
a.k.a. public key encryption
@adam_englander
MAC authenticated encryption
@adam_englander
Signatures can be attached or
detached
@adam_englander
XSalsa20-Poly1305
@adam_englander
Example
@adam_englander
Ed25519 signatures
@adam_englander
Key Exchange
Use with care!
@adam_englander
Examples
@adam_englander
Encryption
@adam_englander
Key Generation
$keyPair = sodium_crypto_box_keypair();
@adam_englander
Getting Public/Private Key Pairs
$secretKey = sodium_crypto_box_secretkey(
$keyPair);
$publicKey = sodium_crypto_box_publickey(
$keyPair);
@adam_englander
Creating Mixed Key Pairs
sodium_crypto_box_keypair_from_secretkey_and_publickey(
$mySecretKey, $theirPublicKey
);
@adam_englander
Encryption
$nonce = random_bytes(
SODIUM_CRYPTO_BOX_NONCEBYTES);
$ciphertext = sodium_crypto_box(
"Hello ,World!",
$nonce,
$keyPair);
@adam_englander
Decryption
$plaintext = sodium_crypto_box_open(
$ciphertext, $nonce, $keyPair);
@adam_englander
Digital Signatures
@adam_englander
Key Generation
$keyPair = sodium_crypto_sign_keypair();
@adam_englander
Getting Public/Private Key Pairs
$secretKey = sodium_crypto_sign_secretkey(
$keyPair);
$publicKey = sodium_crypto_sign_publickey(
$keyPair);
@adam_englander
Signing
$signedMsg = sodium_crypto_sign(
"Hello, World!",
$secretKey
);
@adam_englander
Signature Verification
$originalMsg = sodium_crypto_sign_open(
$signedMsg,
$publicKey
);
if ($originalMsg === false) {
throw new Exception("Fail!");
}
@adam_englander
Hashing
@adam_englander
Standard Hash
$h = sodium_crypto_generichash("Msg");
print base64_encode($h);
URvIHd4RGAg4xWLIK7NfMiP0YGHr3kqVXCez9InPHgM=
@adam_englander
Signed Hash
$key = random_bytes(
SODIUM_CRYPTO_GENERICHASH_KEYBYTES);
$h = sodium_crypto_generichash(
"Msg", $key);
print base64_encode($h);
/qV2j5MfGBjJ9g60PQnnQYSt1Y/1csjJzq37C1pE4SE=
@adam_englander
Short Hash
$key = random_bytes(
SODIUM_CRYPTO_SHORTHASH_KEYBYTES);
$h = sodium_crypto_shorthash(
"Msg", $key);
print base64_encode($h);
eCTWVTKkkKw=
@adam_englander
Key Derivation
@adam_englander
Create KDF Hash
$hash = sodium_crypto_pwhash_str(
'Password',
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
print base64_encode($hash);
$argon2id$v=19$m=65536,t=2,p=1$qCcD3BqZjmbYEFMKxgsUjA$5BzYYNuACwp3Zq
p29QnT9upRxVZykU/P8isst91uKYE==
@adam_englander
Verify KDF Hash
sodium_crypto_pwhash_str_verify(
$hash,
'Password'
);
@adam_englander
Password Extension
@adam_englander
Create Password Hash
$hash = password_hash(
'Password',
PASSWORD_ARGON2I
);
$argon2i$v=19$m=1024,t=2,p=2$WW15cG1NLjR0cXZET3Nzeg$ImFwKTaVgDHme95M
ROV5S9ssG+e458gdpLz9Cwwiba8
@adam_englander
Resources
https://download.libsodium.org/doc/
https://paragonie.com/book/pecl-libsodium
http://php.net/manual/en/book.sodium.php
http://php.net/manual/en/function.password-hash.php
@adam_englander
Thanks to
Our Sponsors
@adam_englander
Rate This Talk
https://joind.in/talk/48fbd

php[tek] 2108 - Cryptography Advances in PHP 7.2