Cryptage et décryptage PHP RSA2 et signature et vérification de l'interface

Est-ce en cours de développement? On a souvent affaire à des interfaces, que ce soit pour appeler l'interface de quelqu'un d'autre ou fournir une interface à quelqu'un d'autre, comment assurer la sécurité et la cohérence des données des deux parties lorsque l'interface est appelée? services de cryptage des données et de vérification de signature. Cet article utilise des exemples PHP pour expliquer l'implémentation des fonctions de cryptage et de décryptage de données RSA2 et de vérification de signature.

Dans l'article précédent " Quelles sont les méthodes de chiffrement courantes dans le développement WEB ", nous avons présenté l'algorithme de chiffrement asymétrique RSA2, qui convient pour chiffrer une petite quantité de données, telles que les données de paiement et d'autres scénarios avec des exigences de sécurité élevées.

Nous devons d'abord générer des fichiers de clés publiques et privées:

openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem

Cryptage RSA2

Nous supposons que les informations de paiement de l'utilisateur doivent être cryptées et soumises au système de paiement principal via l'interface. Le client utilisateur utilise la clé publique pour crypter les données et le système de paiement principal utilise la clé privée pour décrypter les données.

$publicKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRJ6it8Vnl3BUfJok8JYPMkAra
vmjj/cUElcBgp9Ez4hw9rzloqszOye1cyYdkH9EJhp55wwhZl2B6Mx7kahu08wJn
h90j0IVArKUYau9u2hOQ52+VvEAbTYh8LkWfN1gvtcquSVwqKRjmBApo1LTpOooD
FrLRji8oiE7bLXHNgQIDAQAB
-----END PUBLIC KEY-----';

//需要加密的数据
$data = [
    'order_id' => 'N2020020212345689232',
    'money' => 1000000,
    'user_id' => 1982,
    'pay_type' => 'alipay',
    'pay_time' => 1583213421
];

$publicKey = openssl_pkey_get_public($publicKey); //解析公钥
$rs = openssl_public_encrypt(json_encode($data), $encrypted, $publicKey) ? base64_encode($encrypted) : null; 
echo $rs;

Nous pouvons copier et coller la clé publique générée directement dans le fichier de code, ou utiliser fopen()Open pour lire le fichier de clé publique. Notez que le openssl_public_encrypt()contenu en texte brut chiffré ne peut pas être trop long. Pour un contenu trop long, envisagez le chiffrement de segmentation ou utilisez le chiffrement DES.

Après l'exécution, récupérez le contenu chiffré:

A7yj2Yjuc4Y8jhtmz5MdxrMFGhyortBJ53kYQZ8MMNNsjW2rW21a/l4DH247xh0zkPPHHzygGqNIFwuiPFaK2RvubfjZxyqIfNts8RkNXGSTIYCKv6BobI3AWcgF+eyyrhaoTiiCUVwDqNrVoLVZdOPReyK5dOvOPd1nXemhg9Q=

Décryptage RSA2

Une fois que le système de paiement principal a reçu le contenu chiffré, il utilise la clé privée pour le déchiffrer.

$privateKey = '-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANEnqK3xWeXcFR8m
iTwlg8yQCtq+aOP9xQSVwGCn0TPiHD2vOWiqzM7J7VzJh2Qf0QmGnnnDCFmXYHoz
HuRqG7TzAmeH3SPQhUCspRhq727aE5Dnb5W8QBtNiHwuRZ83WC+1yq5JXCopGOYE
CmjUtOk6igMWstGOLyiITtstcc2BAgMBAAECgYBmCrlLE+NON8++QOjXhV4GIYiK
LDe0dAz5La6L+ZQhggFRPvn9TMdbZDz/9fquKK+tvBX5ReP/AdG6DNLXkcUt4yuG
JomQ0qiUw8e2J5xglb0lfgMvFJAUAnBRr8bOwg6YrUcRI9PiXM/bwOnjjX9eA/Ox
Bf7rmvQtfvSWqpEqgQJBAO++2sCInm8Mdy/RrN9A8CLx2Utzbb5e3K5i6Qr3H3As
++Gxx6RVhKhBoF2Kpy2abQclFnzuURH2d8Smun9yDjkCQQDfVdu0zi1OsX5mUuJa
AUfali+eF+HK7uYte9oTJULn1ykJaBkUFYFK08bWURc/SKN4WT4wf537clFVbCl2
KbmJAkEAjR8KAwUoRXPQAJzqpmvCLr+vycMDWWjbe+cLCIJYxh4kkkCkpK4WLTic
HhPMvoJFJUyGhTl/DRTIgUAnTXekuQJAP3FLZVRAaJ9hMb4P0NOWTtDlG/rayGQO
/RK2w0ONewCTBroMjbkCLnh0foMwoGiJD3ICiZJnFXvHAQYlzQxTSQJAFHFi5UmT
99AX8DZ7gRnjFqrzjkEMIY2klKv26x6fSGcoQ7pYhbnj4S9pmUMthfdACWp9kTkW
w5gQhVfGr8dOXA==
-----END PRIVATE KEY-----';

$key = openssl_pkey_get_private($privateKey); //解析私钥
$encrypted = base64_decode($encrypted);
//解密
$mydata = openssl_private_decrypt($encrypted, $decrypted, $key) ? $decrypted : null;
echo $mydata;

Après l'exécution, récupérez les données décryptées:

{"order_id":"N2020020212345689232","money":1000000,"user_id":1982,"pay_type":"alipay","pay_time":1583213421}

Signature RSA2

Tout d'abord, nous devons comprendre pourquoi nous devons signer? Lorsque nous effectuons des demandes de données, afin d'éviter que les données ne soient interceptées ou falsifiées, entraînant des effets néfastes, nous devons effectuer une vérification de la signature lors de l'envoi et de la réception de données via l'interface de données. Le principe de la signature est le suivant: le client et le serveur utilisent le même algorithme de signature pour calculer la signature.Lorsque la signature soumise par le client est cohérente avec la signature fournie par le serveur, la signature est réussie.

Nous utilisons RSA2 pour signer les données clients. Notez que le signataire utilise la clé privée pour prouver que la signature est envoyée par votre client. Bien entendu, la partie de vérification est le serveur qui utilise la clé publique pour vérifier la signature. Dans l'exemple suivant, nous utilisons toujours les clés publiques et privées générées au début de l'article.

//要签名的数据
$data = [
    'order_id' => 'N2020020212345689232',
    'money' => 1000000,
    'user_id' => 1982,
    'pay_type' => 'alipay',
    'pay_time' => 1583213421
];

$privateKey = openssl_pkey_get_private($privateKey);
$signature = openssl_sign(json_encode($data), $sign, $privateKey, OPENSSL_ALGO_SHA256) ? base64_encode($sign) : null;
echo $signature;

La fonction openssl_sign()signe les données de paiement avec RS2 et obtient la signature après l'exécution:

eYg6ss/iOuie8SUikqdTTBmctOatTV+zrw5NGfR33rPJvzSrRRZvC/ynwaS3ZLoX4sUlD0mcF9WEoLwG1IXKeqszkCkY06DejvUZNk4N5Ie49MiBPOgTz2qdWP1Q0bnL2T7c+KqDLn9tk2vzDRUoMW8aPPXuJFiNTYaNf50aty0=

Vérification RSA2

Une fois que le serveur a reçu les données et la signature soumises par le client, il utilise la clé publique pour vérifier la signature.

//接收客户端的签名
$sign = 'eYg6ss/iOuie8SUikqdTTBmctOatTV+zrw5NGfR33rPJvzSrRRZvC/ynwaS3ZLoX4sUlD0mcF9WEoLwG1IXKeqszkCkY06DejvUZNk4N5Ie49MiBPOgTz2qdWP1Q0bnL2T7c+KqDLn9tk2vzDRUoMW8aPPXuJFiNTYaNf50aty0=';
//接收客户端的原始数据
$data = [
    'order_id' => 'N2020020212345689232',
    'money' => 1000000,
    'user_id' => 1982,
    'pay_type' => 'alipay',
    'pay_time' => 1583213421
];

$publicKey = openssl_pkey_get_public($publicKey);
$rs = openssl_verify(json_encode($data), base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256);
var_dump($rs);
if ($rs) {
    echo 'ok';
    ...do something...
} else {
    echo 'fail...';
}

Dans le code ci-dessus, afin de démontrer l' affectation de deux variables à $signet $data, en fait, ces deux valeurs sont transmises par le client, généralement postsoumises, ici n'est pas une démonstration dans le code, vous pouvez vous entraîner par vous-même.

Après avoir exécuté le code ci-dessus, "ok" est sorti avec succès, c'est-à-dire que la vérification est réussie.

ce qui précède.

 

Cet article provient de: helloweba.net

Lien d'origine: https://www.helloweba.net/php/630.html

Je suppose que tu aimes

Origine blog.csdn.net/z3287852/article/details/113421794
conseillé
Classement