La cryptographie n’est pas facile à comprendre, et encore moins à l’implanter.
De la cryptographie asymétrique et symétrique à un bon hachage pour les mots de passe, cette présentation est une introduction complète à la cryptographie par définition, historique, des exemples (PHP) et la mise en œuvre.
Version pour PHP Québec
2. À propos de moi
Bonjour mon nom est Philippe.
Je suis analyste en sécurité
applicative chez Lightspeed.
Développeur Internet de longue
date, auteur, podcasteur et
conférencier. Je suis spécialisé
dans PHP, Symfony, la sécurité,
la qualité du code et la
performance.
Sécurité PHP 5 et MySQL 5
OWASP Montreal
PHP Quebec
Créateur de jeux de table
Auteur de jeux de rôle
5. Nomenclature
Code : utilisation de la substitution au niveau des
mots ou des phrases pour coder
Coder : action réalisée sur un texte lorsqu’on
remplace un mot ou une phrase par un autre mot,
un nombre ou un symbole
6. Nomenclature
Chiffrement : transformation à l’aide d’une clé d’un
message en clair (texte clair) en un message
incompréhensible (texte chiffré) pour celui qui ne
dispose pas de la clé de déchiffrement (en anglais
encryption)
Chiffre : utilisation de la substitution au niveau des
lettres pour coder
11. Nomenclature
Décrypter : retrouver le message clair
correspondant à un message chiffré sans posséder la
clé de déchiffrement (terme que ne possèdent pas
les anglophones, qui eux « cassent » des codes
secrets)
Crypter/Décrypter
12. Un peu d’histoire
Utilisé depuis l’antiquité
Plus ancien connus XVIe siècle av. J.‑C
Chiffre de César
décalage de trois lettres dans l’alphabet sur la
gauche, sans clé
13. Fonctions de hachage
Créé une empreinte d’une chaîne donnée
// 3a46dce77a312a8564495de073fc1d2a
somme de contrôle, empreinte, hash, résumé de
message, condensé, condensat, empreinte
cryptographique
// 39d5668f56394af67c7d349b8cf68e12
19. SHA-3
Compétition pour trouver une nouvelle fonction de
hachage
Organiser par « National Institute of Standards
and Technology »
L’algorithme Keccak
20. BLAKE2
Suite de BLAKE qui était concurrent pour le
SHA-3
Plus rapide que SHA-3, SHA-2, SHA-1 et MD5
Offre une sécurité supérieure à SHA-2
Similaire à celle de SHA-3
25. Attaque par canal auxiliaire
Attaque par sondage
Cryptanalyse acoustique
Analyse d’émanations électromagnétiques
Analyse de consommation
Attaque par analyse du trafic
Attaque par faute
Attaque par prédiction de branches
Attaque temporelle
26. Salage
Ajout d’une chaîne de caractères à l’information
Sel : Chaîne aléatoire concaténée aux mots de
passe
27. Hash Message Authentication Code
Code d’authentification de message
Utilise une clé
Façon rapide de faire un hach un peu plus
sécuritaire pour un mot de passe
//f2cf0703419f807767e0b747d32e22b8e73af6e6
echo hash('sha1', 'phpQuébec');
//45e6831fdec7a34f004d9ddc0ba311b8410ecbbc
echo hash_hmac('sha1', 'phpQuébec', 'secret');
//00ee56aa38a935e88704805ec4d2ec5cfb5d78381b146f8c09c6375e89fced7a
echo sodium_bin2hex(sodium_crypto_generichash('phpQuébec', sodium_crypto_generichash_keygen()));
29. Itération
/**
* @param string $p Mot de passe à protéger
* @param string $s Sel.
* @param int $c Nombre d’itération.
* @param string $secret La valeur secrete à utilisé
* @param string $a Algorithme de hachage.
*
* @return binary Clé dérivée.
*/
function password($p, $s, $c, $secret, $a = 'sha256') {
$dk = $s; // Clé dérivée
// Effectuer itérations
for ($i = 1; $i <= $c; $i++) {
$dk = hash_hmac($a, $dk.$p, $s));
}
return $dk;
}
30. PBKDF2
Standard de chiffrement pour les mots de passe
PKCS #5
(Public Key Cryptographic Standards), ou
standards de cryptographie à clé publique
RFC 2898
31. PBKDF2
/**
* PBKDF2 selon RFC 2898.
*
* @param string $p Mot de passe à protéger
* @param string $s Salt.
* @param int $c Nombre d’itération.
* @param int $dkLen Longueur de la clé dérivé.
* @param string $a Algorithme de hachage.
*
* @return binary Clé dérivée.
*/
function pbkdf2($p, $s, $c, $dkLen, $a = 'sha256')
{
}
32. PBKDF2
function pbkdf2($p, $s, $c, $dkLen, $a = 'sha256') {
$hLen = strlen(hash($a, null, true)); // Longueur du Hash
$l = ceil($dkLen / $hLen); // Nombre de blocs de la clé dérivée.
$dk = ''; // Clé dérivée
for ($block = 1; $block<=$l; $block ++) {
// Hachage initiale pour ce bloc.
$ib = $b = hash_hmac($a, $s . pack('N’, $block), $p, true);
// Effectuer itérations des blocs
for ($i = 1; $i<$c; $i ++) {
// XOR chaque itération
$ib ^= ($b = hash_hmac($a, $b, $p, true));
}
$dk .= $ib;
}
return substr($dk, 0, $dkLen);
}
33. PBKDF2 PHP 5.5+
$algo = 'sha384';
$salt = random_bytes(32);
$password = 'mot de passe';
$iterations = 1000; // minimum
$longueur = 0; // Toute la longueur de la réponse de l’algo
$raw_output = false;
$hashPassword = hash_pbkdf2($algo, $password, $salt, $iterations, $longueur, $raw_output);
// Pour comparer :
$comparaison = hash_equals($hashPasswordInDB, $userHashPassword);
35. Bcrypt
Fonction de hachage
Basé sur Blowfish
Utilise un sel
Fonction adaptative (Itérations)
Itération doit être puissance de 2
36. BCrypt pour Mot de Passe (PHP 5.5+)
$algo = PASSWORD_DEFAULT; // PASSWORD_BCRYPT en 5.5 à 7.1
$password = 'mot de passe';
$hashPassword = password_hash($algo, $password);
// Pour comparer :
if (password_verify($password, $hashPasswordInDB)) {
// Vérifier si un nouvel algorithme de hachage est disponible ou si le coût a changé
if (password_needs_rehash(hashPasswordInDB, PASSWORD_DEFAULT, $options)) {
// Si c’est le cas, créez un nouveau hash et remplacez l’ancien
$newHash = password_hash($password, PASSWORD_DEFAULT, $options);
}
// Connectez l’utilisateur
}
37. Argon2
Fonction de dérivation de clé
Gagnante de la Password Hashing
Competition en juillet 2015
Décline en deux versions :
Argon2d
Argon2i
Argon2id}
38. Argon2 pour Mot de Passe (PHP 7.1+)
$algo = PASSWORD_DEFAULT; // PASSWORD_ARGON2I en 7.2 et PASSWORD_ARGON2ID en 7.3
$password = 'mot de passe';
$hashPassword = password_hash($algo, $password);
// Pour comparer :
if (password_verify($password, $hashPasswordInDB)) {
// Vérifier si un nouvel algorithme de hachage est disponible ou si le coût a changé
if (password_needs_rehash(hashPasswordInDB, PASSWORD_DEFAULT, $options)) {
// Si c’est le cas, créez un nouveau hash et remplacez l’ancien
$newHash = password_hash($password, PASSWORD_DEFAULT, $options);
}
// Connectez l’utilisateur
}
39. Utilisation pour les mots de passe
PASSWORD_DEFAULT
Sinon selon l’OWASP :
Argon2
PBKDF2
scrypt
bcrypt
40. Algorithmes de chiffrement faibles
echo str_rot13('PHP 5.3.9'); // CUC 5.3.9
Chiffre de César
ROT13
rotation de 13 caractères, sans clé
41. Algorithmes de chiffrement faibles
echo str_rot13('PHP 5.3.9'); // CUC 5.3.9
Chiffre de César
ROT13
rotation de 13 caractères, sans clé
53. Data Encryption Standard (DES)
Clés de 56 bits
Transforme un bloc de 64 bits en un autre bloc de
64 bits
Très faible
MCRYPT_DES
OPENSSL_CIPHER_DES
54. Data Encryption Standard (DES)
Clés de 56 bits
Transforme un bloc de 64 bits en un autre bloc de
64 bits
Très faible
MCRYPT_DES
OPENSSL_CIPHER_DES
55. Triple DES
Passe 3x DES sur un bloc de 64 bits
Utilise 2 ou 3 clés de 56 bits
Faible
MCRYPT_3DES (MCRYPT_TRIPLEDES)
OPENSSL_CIPHER_3DES
56. Triple DES
Passe 3x DES sur un bloc de 64 bits
Utilise 2 ou 3 clés de 56 bits
Faible
MCRYPT_3DES (MCRYPT_TRIPLEDES)
OPENSSL_CIPHER_3DES
57. RC4
Clé de taille variable, typiquement entre 40 et 256
bits
Utilise un tableau de 256 octets
Chiffrement text clair via XOR en utilisant le
tableau
Utiliser par WEP, WPA et TLS
82. Crédits photo
Tous les graphes et les photographies sont utilisés
sous licence Creative Commons.
Les graphes des chiffrements par blocs viennent de
Wikipédia.