Cet article présente principalement un résumé de l'utilisation de l'extension de chiffrement openssl de PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
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. pour assurer la sécurité de la transmission des données, nous devons garantir : la source des données (demande non falsifiée), l'intégrité des données (non modifiées), la 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é, et l'expéditeur utilise la clé pour chiffrer le fichier, 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 d'opposés. clés. , divisées en clé publique et clé privée. La clé privée est conservée en toute sécurité et la clé publique est rendue 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. valeur Connue sous le nom de 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
Signature numérique commune ; les algorithmes incluent md5, hash1 et d’autres algorithmes.
L'extension openssl de PHP
l'extension openssl utilise le package d'extension de chiffrement openssl, qui encapsule plusieurs PHP liés à la fonction de cryptage et de décryptage, 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 les données à chiffrer, $method est la méthode à utiliser pour le chiffrement, $password est la clé à utiliser et la fonction renvoie les données cryptées Le $ ; La liste de méthodes peut utiliser openssl_get_cipher_methods() pour l'obtenir. Nous en sélectionnons une à utiliser. La liste $method se présente sous la forme :Array( 0 => aes-128-cbc, // aes加密 1 => des-ecb, // des加密 2 => des-ede3, // 3des加密 ... )
<. 🎜>La fonction de décryptage est la chaîne 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 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, et 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, il se peut qu'il ne s'agisse pas exactement du bit de chiffrement. Un multiple entier du nombre de bits, donc $padding est requis. Les options pour $padding sont 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(); // 使用公匙解密;
签名函数:$data为要签名的数据;$signature为签名结果的引用变量;$priv_key_id为签名所使用的私匙;$signature_alg为签名要使用的算法,其算法列表可以使用<span style="font-family:NSimsun">openssl_get_md_methods ()</span>
得到,形如:
array( 0 => MD5, 1 => SHA1, 2 => SHA256, ... )
验签函数:与签名函数相对,只不过它要传入与私匙对应的公匙;其结果为签名验证结果,1为成功,0为失败,-1则表示错误;
加密实例
以下是一个非对称加密使用的小例子:
// 获取公匙 $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;
而对称加密就非常简单了,直接使用ssl_encrypt()函数即可;
当然一些接口可能会对加密方法进行不同的要求,如不同的padding,加密块大小等等,这些就需要使用者自己调整了。
因为我们是在HTTP协议之上处理的数据,所以数据加密完成后,就可以直接发送了,不用再考虑底层的传输,使用cURL或SOAP扩展方法,就可以直接请求接口啦。
结语
密码学是一个十分高深的学科,它理论艰深,概念繁多,作为一个WEB开发人员,虽然不需要我们去研究其底层实现,但是学会使用封装好的方法很有利于我们开发。甚至了解其基本实现,也可以触类旁通,对算法等有新的理解。
以上就是本篇文的全部内容,希望能对大家的学习有所帮助。
相关推荐:
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!