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 un 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 chaîne openssl_encrypt (string $data, string $method, string $password)
Concernant le chiffrement asymétrique :
openssl_get_publickey();openssl_pkey_get_public(); // 从证书导出公匙; openssl_get_privatekey();openssl_pkey_get_private(); // 从证书导出私匙;
Ils doivent tous simplement 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 à chiffrer ; $crypted est une variable de référence, les données chiffré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 l'être ; exactement un multiple entier du nombre de bits de cryptage, donc $padding est requis (Padding), les options pour $padding incluent OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING, qui sont respectivement un remplissage PKCS1 ou aucun remplissage
Le contraire de cette méthode ; is (les paramètres entrants 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 de signature : $data est la donnée à signer $signature is ; la variable de référence du résultat de la signature ; $priv_key_id est la valeur privée utilisée pour la clé de 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 : elle est opposée à la fonction de signature, sauf qu'elle doit transmettre la clé privée. La clé publique correspondant à la clé ; le résultat est le résultat de la vérification de signature, 1 signifie succès, 0 signifie échec, -1 signifie erreur ;
Exemple de chiffrement
Ce qui suit est un petit exemple de chiffrement asymétrique Exemple :
// 获取公匙 $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;
Le chiffrement symétrique est très simple, utilisez simplement le ssl_encrypt() fonctionne directement ;
Bien sûr, certaines interfaces peuvent avoir des exigences différentes pour les méthodes de cryptage, telles que différents remplissages, tailles de bloc de cryptage, etc., celles-ci doivent être ajustées par l'utilisateur.
É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 le faire. demander directement l'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 sa mise en œuvre sous-jacente, apprendre à utiliser des méthodes encapsulées 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 de résumé de l'utilisation de l'extension de chiffrement PHP openssl (recommandé), veuillez faire attention au site Web PHP chinois !