Maison  >  Article  >  développement back-end  >  Comment PHP utilise le chiffrement symétrique dans le chiffrement OpenSSL

Comment PHP utilise le chiffrement symétrique dans le chiffrement OpenSSL

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-05-31 09:28:432675parcourir

Cet article vous présentera comment PHP utilise le cryptage symétrique dans le cryptage OpenSSL. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment PHP utilise le chiffrement symétrique dans le chiffrement OpenSSL

Nous avons beaucoup appris sur les extensions de chiffrement en PHP. À partir d’aujourd’hui, ce que nous allons apprendre est la chose la plus importante, à savoir l’utilisation de l’extension de chiffrement OpenSSL. Pourquoi est-ce considéré comme le point le plus important ? Premièrement, OpenSSL est actuellement la norme de facto pour le cryptage des données en PHP et même dans l'ensemble du cercle de développement, le cryptage, y compris HTTPS/SSL, est son application pratique. Deuxièmement, OpenSSL fournit des formes de cryptage symétriques et asymétriques, ce que nous faisons quotidiennement. méthodes de cryptage courantes dans , c'est ce que nous devons maîtriser.

Alors, est-ce différent du cryptage de type Hash ? Le cryptage de type hachage est un cryptage irréversible unidirectionnel.Le contenu crypté est une chaîne de hachage hexadécimale. Nous ne pouvons utiliser la table arc-en-ciel que pour inverser le contenu en texte brut, donc tant que nous ajoutons une valeur salt ou plusieurs ensembles de cryptage à deux couches, Il est très difficile de procéder à une ingénierie inverse. Par conséquent, le cryptage par hachage est généralement utilisé pour enregistrer les mots de passe des utilisateurs. Même si la base de données divulgue le mot de passe de l'utilisateur, il reste sécurisé. OpenSSL, un type de cryptage symétrique/asymétrique, peut effectuer un cryptage direct et un déchiffrement inverse via un certain mot-clé ou certificat. Le texte original

est disponible. Parlons maintenant en détail des problèmes de chiffrement symétrique et asymétrique.

Qu'est-ce que le cryptage symétrique et asymétrique

Le cryptage symétrique crypte généralement le texte original via une clé. Autrement dit, qu'il s'agisse du serveur, du client ou de tout autre homologue, lorsque les deux extrémités communiquent, le contenu chiffré qu'elles transmettent doit utiliser la même clé pour les opérations de chiffrement/déchiffrement. Les deux extrémités doivent sauvegarder une telle clé en même temps. Je suppose que tout le monde y a également pensé. Désormais, qu'il s'agisse de développement Web ou de développement d'applications, le code peut être décompilé et le code source peut être visualisé. Si un cryptage symétrique est utilisé, la clé peut être facilement obtenue. Cependant, l’avantage du chiffrement symétrique est qu’il est très rapide et ne consomme pas de ressources.

Le cryptage asymétrique contient des clés différentes aux deux extrémités. Tout comme les certificats https les plus courants que nous voyons, ils ont deux concepts : clé publique et clé privée. Généralement, nous utiliserons la clé publique pour le cryptage, puis la clé privée pour le déchiffrement. Habituellement, la clé publique est rendue publique et envoyée à l'autre partie, tandis que la clé privée est conservée ici. C'est-à-dire que lorsque l'autre partie nous envoie des données, elle utilise la clé publique que nous lui avons donnée pour chiffrer les données. Les données sont très sûres pendant le processus de transmission, car personne d'autre ne dispose de la clé privée pour déchiffrer les données avant. nous Après avoir reçu les données, vous utilisez votre propre clé privée pour les déchiffrer et obtenir les données originales. Étant donné que le contenu des clés des deux côtés n’est pas le même, le chiffrement asymétrique est bien plus sécurisé que le chiffrement symétrique. Bien que l'algorithme et la complexité du cryptage asymétrique soient plusieurs niveaux supérieurs à ceux du cryptage symétrique, par rapport aux avantages du cryptage symétrique, la vitesse et les performances sont devenues des goulots d'étranglement dans le cryptage asymétrique, en particulier lorsque la quantité de données est importante. De plus, le principe mathématique du cryptage asymétrique est qu'il est difficile de décomposer de grands nombres, c'est-à-dire que plus le nombre est grand, plus il est difficile de le factoriser. Si un algorithme peut résoudre ce problème en peu de temps, alors félicitations, c'est la base des algorithmes de cryptage modernes. C'est vous qui avez brisé le plafond.

Les algorithmes couramment utilisés pour le cryptage symétrique incluent : AES, DES, 3DES, IDEA, RC2, RC5, etc. Les algorithmes les plus couramment utilisés sont AES et DES.

Les algorithmes couramment utilisés pour le cryptage asymétrique incluent : RSA, Elgamal, ECC, etc. RSA est très couramment utilisé et courant SSL et certains algorithmes de certificat sont basés sur RSA.

Que devons-nous faire pour la sécurité du système ?

Alors, avons-nous un moyen de compromis pour utiliser ces deux capacités de cryptage ? Bien sûr qu’il y en a, et c’est aussi une technologie très classique : les enveloppes numériques.

En fait, le sens est très simple, c'est de profiter des avantages respectifs de ces deux méthodes de cryptage. Le cryptage asymétrique a une sécurité élevée, mais une vitesse lente, et plus la quantité de données est grande, plus la vitesse est lente. Ensuite, nous l'utilisons pour crypter la clé de cryptage symétrique. Habituellement, cette clé n'est pas très volumineuse. Ensuite, l’entité de données réelle utilise cette clé chiffrée symétriquement pour effectuer un chiffrement symétrique afin d’améliorer la vitesse. De cette façon, lorsque nous l'envoyons au client, il comprend deux contenus, l'un est la clé cryptée avec un cryptage asymétrique et l'autre est le contenu des données cryptées avec un cryptage symétrique. Une fois que le client a obtenu les informations, il utilise d'abord la clé de chiffrement asymétrique pour décoder la clé de chiffrement symétrique, puis utilise cette clé pour déchiffrer le contenu final des données. Êtes-vous confus? Jetons-y un coup d'œil à travers une image, et peut-être que tout le monde le comprendra d'un coup d'œil.

Comment PHP utilise le chiffrement symétrique dans le chiffrement OpenSSL

Parmi eux, la clé publique et la clé privée ne nécessitent aucune explication supplémentaire. La clé de session est la clé de notre algorithme de chiffrement symétrique. Combiné avec l'explication ci-dessus du processus de transmission de l'enveloppe numérique, tout le monde devrait pouvoir le comprendre.

Cryptage symétrique étendu OpenSSL

Bon, après avoir introduit tant de connaissances théoriques, revenons au sujet, comment implémenter le cryptage symétrique et asymétrique dans PHP Woollen Cloth ? C'est très simple, il suffit d'utiliser l'extension OpenSSL. Cette extension est également publiée avec le code source PHP. Ajoutez simplement --with-openssl lors de la compilation et de l'installation. Bien entendu, cela nécessite également que le logiciel OpenSSL soit installé dans l'environnement système. Il est déjà disponible dans divers systèmes d'exploitation. Sinon, installez-le vous-même. Le moyen le plus simple consiste à voir s'il existe une commande openssl sur la ligne de commande du système d'exploitation pour voir si le logiciel associé à OpenSSL est installé sur le système actuel.

[root@localhost ~]# openssl version
OpenSSL 1.1.1 FIPS  11 Sep 2018

Aujourd'hui, nous étudions principalement des fonctions relativement simples liées au chiffrement symétrique.

Implémentation du cryptage/déchiffrement symétrique

$data = '测试对称加密';
$key = '加密用的key';
$algorithm =  'DES-EDE-CFB';


$ivlen = openssl_cipher_iv_length($algorithm);
$iv = openssl_random_pseudo_bytes($ivlen);


$password = openssl_encrypt($data, $algorithm, $key, 0, $iv);
echo $password, PHP_EOL;
// 4PvOc75QkIJ184/RULdOTeO8

echo openssl_decrypt($password, $algorithm, $key, 0, $iv), PHP_EOL;
// 测试对称加密

// Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended

openssl_encrypt() consiste à crypter les données. Elle nécessite trois paramètres : le texte original, l'algorithme et la clé. Ces derniers paramètres sont facultatifs, mais ils sont désormais recommandés. Pour définir le paramètre iv (vecteur), donc s'il n'y a pas de paramètre iv, un message d'avertissement sera signalé. Nous utilisons openssl_cipher_iv_length() pour obtenir la longueur iv requise par l'algorithme actuel, puis utilisons la fonction openssl_random_pseudo_bytes() pour générer un contenu iv aléatoire qui correspond à la longueur de l'algorithme.

Le paramètre 0 du milieu est la valeur OU au niveau du bit de la balise spécifiée. Il a deux constantes facultatives : OPENSSL_RAW_DATA et OPENSSL_ZERO_PADDING Si elle est définie sur OPENSSL_RAW_DATA, les données cryptées seront renvoyées telles quelles (contenu binaire tronqué). défini sur OPENSSL_ZERO_PADDING, les données cryptées seront renvoyées comme contenu après base64.

openssl_decrypt() est utilisé pour décrypter les données. Les paramètres requis sont fondamentalement les mêmes que la fonction de cryptage, sauf que les données d'origine sont remplacées par des données cryptées.

Dans le cryptage symétrique, nous avons également un mode de chiffrement AEAD (GCM ou CCM). Lors de l'utilisation de cet algorithme de mode, nous avons besoin d'un paramètre supplémentaire.

$algorithm =  'aes-128-gcm';
$password = openssl_encrypt($data, $algorithm, $key, 0, $iv, $tags);
echo $password, PHP_EOL;
// dPYsR+sdP56rQ99CNxciah+N

echo openssl_decrypt($password, $algorithm, $key, 0, $iv, $tags), PHP_EOL;
// 测试对称加密

Ce $tags est un paramètre de type référence, c'est-à-dire qu'il sera attribué à cette variable après le cryptage. La même balise de vérification est également requise lors du décryptage.

Du point de vue du processus de cryptage et de décryptage, si nous voulons enregistrer ces informations dans la base de données, ou lors de la transmission et du décryptage, nous devons au moins enregistrer ou transmettre ces champs, le iv utilisé pour le cryptage, et le iv utilisé pour l'algorithme de cryptage et la balise de vérification utilisée pour le cryptage en mode AEAD, sinon les données ne peuvent pas être déchiffrées.

Requête d'algorithme de chiffrement symétrique

print_r(openssl_get_cipher_methods());

// Array
// (
//     [0] => AES-128-CBC
//     [1] => AES-128-CBC-HMAC-SHA1
//     [2] => AES-128-CFB
//     [3] => AES-128-CFB1
//     [4] => AES-128-CFB8
//     [5] => AES-128-CTR
//     [6] => AES-128-ECB
//     [7] => AES-128-OFB
//     [8] => AES-128-XTS
//     [9] => AES-192-CBC
//     [10] => AES-192-CFB
//     [11] => AES-192-CFB1
//     [12] => AES-192-CFB8
//     ……
// )

L'algorithme sélectionné dans le test de chiffrement/déchiffrement ci-dessus est trouvé à partir de cette fonction. Cette fonction affiche une liste de tous les algorithmes pris en charge dans l'environnement actuel.

Résumé

Le contenu de cet article contient beaucoup de connaissances théoriques, et chacun doit encore le digérer. Utiliser OpenSSL pour implémenter la fonction de chiffrement/déchiffrement est en fait relativement simple. Après tout, tout a été encapsulé pour nous. Il suffit d'appeler la fonction conformément à la documentation. Apprendre nécessite encore de combiner théorie et pratique. Bien sûr, le plus important est de le faire soi-même !

Code de test :

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84OpenSSL%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86.php

Apprentissage recommandé : Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer