Cifrado y descifrado PHP RSA2 y firma y verificación de interfaz

¿Está en desarrollo? A menudo tenemos que lidiar con interfaces, ya sea para llamar a la interfaz de otra persona o proporcionar una interfaz a otra persona, ¿cómo garantizar la seguridad y la coherencia de los datos de ambas partes cuando se llama a la interfaz? servicios de encriptación de datos y verificación de firmas. Este artículo utiliza ejemplos de PHP para explicar la implementación de las funciones de encriptación y desencriptación de datos RSA2 y verificación de firmas.

En el artículo anterior " Cuáles son los métodos de cifrado comunes en el desarrollo WEB ", presentamos el algoritmo de cifrado asimétrico RSA2, que es adecuado para cifrar una pequeña cantidad de datos, como datos de pago y otros escenarios con altos requisitos de seguridad.

Primero necesitamos generar archivos de claves públicas y privadas:

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

Cifrado RSA2

Suponemos que la información de pago del usuario debe cifrarse y enviarse al sistema de pago back-end a través de la interfaz. El cliente de usuario utiliza la clave pública para cifrar los datos y el sistema de pago back-end utiliza la clave privada para descifrar los datos.

$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;

Podemos copiar y pegar la clave pública generada directamente en el archivo de código, o usar fopen()Abrir para leer el archivo de clave pública. Tenga en cuenta que el openssl_public_encrypt()contenido de texto sin formato cifrado no puede ser demasiado largo. Para contenido demasiado extenso, considere el cifrado de segmentación o utilice el cifrado DES.

Después de ejecutar, obtenga el contenido cifrado:

A7yj2Yjuc4Y8jhtmz5MdxrMFGhyortBJ53kYQZ8MMNNsjW2rW21a/l4DH247xh0zkPPHHzygGqNIFwuiPFaK2RvubfjZxyqIfNts8RkNXGSTIYCKv6BobI3AWcgF+eyyrhaoTiiCUVwDqNrVoLVZdOPReyK5dOvOPd1nXemhg9Q=

Descifrado RSA2

Una vez que el sistema de pago back-end recibe el contenido cifrado, utiliza la clave privada para descifrarlo.

$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;

Después de ejecutar, obtenga los datos descifrados:

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

Firma RSA2

En primer lugar, debemos entender por qué tenemos que firmar. Cuando realizamos solicitudes de datos, para evitar que los datos sean interceptados o manipulados, causando efectos negativos, debemos realizar la verificación de la firma al enviar y recibir datos a través de la interfaz de datos. El principio de la firma es: el cliente y el servidor utilizan el mismo algoritmo de firma para calcular la firma.Cuando la firma enviada por el cliente es consistente con la firma proporcionada por el servidor, la firma es exitosa.

Usamos RSA2 para firmar los datos del cliente. Tenga en cuenta que la parte firmante utiliza la clave privada para demostrar que la firma se envía desde su cliente. Por supuesto, la parte de verificación es el servidor que usa la clave pública para verificar la firma. En el siguiente ejemplo, seguimos usando las claves públicas y privadas generadas al principio del artículo.

//要签名的数据
$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 función openssl_sign()firma los datos de pago con RS2 y obtiene la firma después de ejecutarse:

eYg6ss/iOuie8SUikqdTTBmctOatTV+zrw5NGfR33rPJvzSrRRZvC/ynwaS3ZLoX4sUlD0mcF9WEoLwG1IXKeqszkCkY06DejvUZNk4N5Ie49MiBPOgTz2qdWP1Q0bnL2T7c+KqDLn9tk2vzDRUoMW8aPPXuJFiNTYaNf50aty0=

Verificación RSA2

Una vez que el servidor recibe los datos y la firma enviados por el cliente, utiliza la clave pública para verificar la firma.

//接收客户端的签名
$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...';
}

En el código anterior, con el fin de demostrar la asignación de dos variables a $signy $data, de hecho, estos dos valores se transmiten desde el cliente, por lo general postpresentado, aquí no es una manifestación en el código, se puede practicar por sí mismo.

Después de ejecutar el código anterior, se emite "ok" correctamente, es decir, la verificación se realiza correctamente.

lo anterior.

 

Este artículo proviene de: helloweba.net

Enlace original: https://www.helloweba.net/php/630.html

Supongo que te gusta

Origin blog.csdn.net/z3287852/article/details/113421794
Recomendado
Clasificación