Introduction
Dans l'histoire du développement d'Internet, la sécurité a toujours été un sujet auquel les développeurs attachent une grande importance. Afin d'assurer la sécurité de la transmission des données, nous devons garantir : la source des données (non). -requêtes falsifiées), intégrité des données (n'a pas été modifiée), confidentialité des données (texte crypté, ne peut pas être lu directement), etc. Bien qu'il existe déjà un protocole HTTPS implémenté par le protocole SSL/TLS, il repose sur la bonne implémentation du navigateur sur le client et est très inefficace. Par conséquent, les données sensibles générales (telles que les informations de paiement des transactions, etc.) ont toujours besoin de nous. pour utiliser des méthodes de cryptage pour chiffrer manuellement.
Bien qu'il ne soit pas nécessaire pour les développeurs WEB ordinaires d'avoir une compréhension approfondie de certaines technologies sous-jacentes liées à la sécurité, il est nécessaire d'apprendre les bases du cryptage et d'utiliser les outils existants liés au cryptage. En raison de besoins professionnels, j'ai lu quelques articles liés au chiffrement et j'ai complété cet article en me basant sur ma propre expérience.
Bases du chiffrement
Avant d'apprendre à utiliser le chiffrement, nous devons comprendre certaines connaissances de base liées au chiffrement.
Les algorithmes de chiffrement sont généralement divisés en deux types : les algorithmes de chiffrement symétriques et les algorithmes de chiffrement asymétriques.
Cryptage symétrique
L'algorithme de cryptage symétrique est que l'expéditeur et le destinataire du message utilisent la même clé. L'expéditeur utilise la clé pour crypter le fichier et le destinataire utilise la même clé pour. décrypter et obtenir les informations. Les algorithmes de chiffrement symétrique courants sont : des/aes/3des.
Les caractéristiques des algorithmes de chiffrement symétrique sont : rapides, la taille du fichier ne change pas beaucoup avant et après le chiffrement, mais le stockage de la clé est un gros problème , car l'expéditeur du message Si la clé de l'une ou l'autre des parties est perdue, la transmission des informations deviendra dangereuse.
Cryptage asymétrique
L'opposé du cryptage symétrique est le cryptage asymétrique. L'idée principale du cryptage asymétrique est d'utiliser une paire de clés relatives, divisées en clé publique et clé privée. clé elle-même Gardez-la en sécurité et rendez la clé publique publique. La clé publique et la clé privée forment une paire. Si la clé publique est utilisée pour chiffrer les données, seule la clé privée correspondante peut être utilisée pour les déchiffrer ; si la clé privée est utilisée pour chiffrer les données, alors seule la clé publique correspondante ; peut être utilisé pour le décrypter. Utilisez simplement la clé publique du destinataire pour crypter les données avant de les envoyer. Les algorithmes de chiffrement asymétriques courants incluent RSA/DSA :
Bien que le chiffrement asymétrique ne pose pas de problèmes de stockage de clés, il nécessite une grande quantité de calculs et la vitesse de chiffrement est très lente. Parfois, nous devons bloquer de gros morceaux de données. cryptage.
Signature numérique
Afin de garantir l'intégrité des données, une valeur de hachage doit être calculée via une fonction de hachage. Cette valeur de hachage est appelée signature numérique. Ses caractéristiques sont :
•Quelle que soit la taille des données originales, la longueur du résultat est la même
•L'entrée est la même et la sortie est la même
• ; De petites modifications apportées à l'entrée feront une grande différence dans le résultat ;
•Le processus de cryptage est irréversible et les données originales ne peuvent pas être obtenues via la valeur de hachage
Les algorithmes de signature numérique courants incluent md5 ; , hash1 et d'autres algorithmes.
Extension openssl de PHP
L'extension openssl utilise le package d'extension de chiffrement openssl, qui encapsule plusieurs fonctions PHP liées au cryptage et au décryptage, ce qui facilite grandement le cryptage et le décryptage des données. Les fonctions couramment utilisées sont :
Cryptage symétrique lié :
string openssl_encrypt (string $data, string $method, string $password)
où $data est ce qui doit être Données cryptées, $method est la méthode à utiliser pour le cryptage, $password est la clé à utiliser et la fonction renvoie les données cryptées ;
La liste $method peut être obtenue en utilisant openssl_get_cipher_methods(), nous sélectionnez-en une et utilisez , la liste $method est sous la forme :
Array( 0 => aes-128-cbc, // aes加密 1 => des-ecb, // des加密 2 => des-ede3, // 3des加密 ... )
La fonction de décryptage est une string openssl_encrypt ( string $data , string $method , string $password)
Cryptage asymétrique lié :
openssl_get_publickey();openssl_pkey_get_public(); // 从证书导出公匙; openssl_get_privatekey();openssl_pkey_get_private(); // 从证书导出私匙;
Ils n'ont tous qu'à transmettre le fichier de certificat (généralement un fichier .pem) ;
openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] )
Utilisez la clé publique pour chiffrer les données, où $data est les données à être chiffré ; $crypted est une variable de référence, après le chiffrement Les données seront placées dans cette variable ; $key est les données de clé publique à transmettre car lorsque les données chiffrées sont regroupées, elles peuvent ne pas être exactement un multiple entier de ; le nombre de bits de cryptage, donc $padding est requis. , les options de $padding incluent OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING, qui sont respectivement un remplissage PKCS1 ou aucun remplissage
Le contraire de cette méthode est (les paramètres d'entrée sont cohérents ; ) :
openssl_private_encrypt(); // 使用私匙加密; openssl_private_decrypt(); // 使用私匙解密; openssl_private_decrypt(); // 使用公匙解密;
Il existe également des fonctions de signature et de vérification :
bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] ) int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
Fonction Signature : $data est les données à signer ; $signature est la variable de référence du résultat de la signature ; $priv_key_id est la clé privée utilisée pour la signature ; $signature_alg est l'algorithme à utiliser ; pour la signature. La liste des algorithmes peut être obtenue en utilisant openssl_get_md_methods(), sous la forme :
array( 0 => MD5, 1 => SHA1, 2 => SHA256, ... )
Fonction de vérification de signature : en face de la fonction de signature, sauf qu'elle doit transmettre la clé publique correspondant à la clé privée ; le résultat est le résultat de la vérification de la signature, 1 signifie succès, 0 signifie échec, -1 signifie erreur
Exemple de chiffrement
Ce qui suit est un petit exemple de cryptage asymétrique :// 获取公匙 $pub_key = openssl_get_publickey('test.pem'); $encrypted = ''; // 对数据分块加密 for ($offset = 0, $length = strlen($raw_msg); $offset < $length; $offset += $key_size){ $encryptedBlock = ''; $data = substr($raw_msg, $offset, $key_size) if (!openssl_public_encrypt($data, $encryptedBlock, $pub_key, OPENSSL_PKCS1_PADDING)){ return ''; } else { $encrypted .= $encryptedBlock; } return $encrypted;
Étant donné que nous traitons les données au-dessus du protocole HTTP, une fois le cryptage des données terminé, elles peuvent être envoyées directement. Il n'est pas nécessaire de prendre en compte la transmission sous-jacente. En utilisant les méthodes d'extension cURL ou SOAP, vous pouvez directement demander le fichier. interface.
Conclusion
La cryptographie est un sujet très avancé avec des théories difficiles et de nombreux concepts. En tant que développeur WEB, même si nous n'avons pas besoin d'étudier son implémentation sous-jacente, il est bon d'apprendre à utiliser l'encapsulation. La méthode est très bénéfique pour notre développement. Même comprendre sa mise en œuvre de base peut vous aider à acquérir une nouvelle compréhension des algorithmes, etc.
Le résumé ci-dessus de l'utilisation de l'extension de chiffrement openssl de PHP (recommandée) est tout le contenu partagé par l'éditeur. J'espère qu'il pourra vous donner une référence, et j'espère que vous soutiendrez le site Web PHP chinois.
Pour plus d'articles liés au résumé de l'utilisation de l'extension de chiffrement openssl de PHP, veuillez prêter attention au site Web chinois de PHP !