Dengan pembangunan Internet yang berterusan, skop aplikasi API (Antara Muka Pengaturcaraan Aplikasi) menjadi semakin meluas, dan interaksi data antara pelbagai sistem menjadi semakin kerap. Untuk penghantaran data sensitif, penyulitan dan penyahsulitan data adalah langkah penting. Artikel ini akan memperkenalkan cara mengendalikan penyulitan dan penyahsulitan data apabila melaksanakan API berdasarkan PHP.
1. Mengapa penyulitan data diperlukan
Penyulitan data merujuk kepada menukar teks biasa asal kepada teks sifir mengikut algoritma tertentu, supaya orang yang belum memperoleh kunci yang sepadan tidak dapat mentafsirnya, dengan itu mencapai Kerahsiaan data. Dalam pembangunan API, sebab utama penyulitan data ialah dua perkara berikut:
Apabila API dibuka kepada pihak ketiga, disebabkan oleh Transmisi tidak tidak menjamin bahawa ia akan dijalankan dalam persekitaran komunikasi peribadi, jadi penyulitan boleh digunakan untuk memastikan keselamatan dan ketulenan data untuk mengelakkan data dicuri atau diganggu semasa proses penghantaran.
Penyulitan data boleh memastikan kesahihan penghantaran data melalui pengesahan identiti, tandatangan, dsb. Semasa proses penghantaran permintaan API, parameter permintaan disulitkan dengan algoritma tidak boleh balik untuk memastikan kesahihan permintaan dan mengelakkan pengubahan atau pemalsuan data permintaan secara haram.
2. PHP melaksanakan penyulitan data
Algoritma penyulitan simetri bermakna kunci yang digunakan untuk penyulitan dan penyahsulitan adalah sama, anda hanya perlu lulus kunci sebagai parameter untuk menyelesaikan operasi penyulitan dan penyahsulitan. Algoritma penyulitan simetri yang biasa digunakan dalam pembangunan API termasuk DES, 3DES, AES, dsb.
Mengambil algoritma penyulitan AES sebagai contoh, PHP menyediakan fungsi seperti openssl_encrypt() dan openssl_decrypt() untuk melaksanakan operasi penyulitan simetri. Penggunaannya adalah seperti berikut:
//AES加密 function aesEncrypt($data, $key) { $iv_len = openssl_cipher_iv_length('AES-128-CBC'); $iv = openssl_random_pseudo_bytes($iv_len); $encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); $result = base64_encode($iv . $encrypted); return $result; } //AES解密 function aesDecrypt($data, $key) { $data = base64_decode($data); $iv_len = openssl_cipher_iv_length('AES-128-CBC'); $iv = substr($data, 0, $iv_len); $encrypted = substr($data, $iv_len); $decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); return $decrypted; }
Antaranya, $data ialah data yang hendak disulitkan, dan $key ialah kuncinya. Semasa proses penyulitan, dapatkan panjang vektor IV yang diperlukan oleh algoritma penyulitan dengan memanggil openssl_cipher_iv_length(), panggil openssl_random_pseudo_bytes() untuk menjana vektor IV rawak, dan kemudian panggil fungsi openssl_encrypt() untuk melaksanakan operasi penyulitan. Dalam proses penyahsulitan, teks sifir mula-mula dipulihkan kepada data binari melalui fungsi base64_decode(), kemudian vektor IV dan data yang disulitkan diekstrak masing-masing, dan fungsi openssl_decrypt() dipanggil untuk melaksanakan operasi penyahsulitan.
Algoritma penyulitan asimetri bermakna kunci yang digunakan untuk penyulitan dan penyahsulitan adalah berbeza Secara amnya, kunci awam didedahkan kepada umum dan digunakan untuk menyulitkan data. Ia kemudiannya dinyahsulit oleh kunci persendirian di bahagian pelayan. Dalam pembangunan API, algoritma penyulitan asimetri biasa termasuk RSA, DSA, dsb.
Mengambil algoritma penyulitan RSA sebagai contoh, PHP menyediakan fungsi seperti openssl_public_encrypt dan openssl_private_decrypt untuk melaksanakan operasi penyulitan asimetri. Penggunaannya adalah seperti berikut:
//RSA加密 function rsaEncrypt($data,$public_key) { $encrypted = ''; openssl_public_encrypt($data,$encrypted,$public_key,OPENSSL_PKCS1_PADDING); $encrypted = base64_encode($encrypted); return $encrypted; } //RSA解密 function rsaDecrypt($data,$private_key) { $decrypted = ''; openssl_private_decrypt(base64_decode($data),$decrypted,$private_key,OPENSSL_PKCS1_PADDING); return $decrypted; }
Antaranya, $data ialah data yang akan disulitkan, dan $public_key ialah kunci awam. Semasa proses penyulitan, data disulitkan dengan memanggil fungsi openssl_public_encrypt() dan kemudian data yang disulitkan dikodkan oleh fungsi base64_encode(). Semasa proses penyahsulitan, data yang disulitkan dinyahsulitkan dengan memanggil fungsi openssl_private_decrypt(), dan kemudian data yang disulitkan dikembalikan.
3. PHP melaksanakan tandatangan data
Tandatangan data dalam API disahkan kesahihannya dengan mencincang parameter. Untuk parameter permintaan API, pelayan perlu melakukan tandatangan data untuk memastikan integriti dan ketulenan penghantaran data.
Algoritma pencincangan yang biasa digunakan termasuk HMAC, SHA1, MD5, dsb. Mengambil HMAC sebagai contoh, tandatangan data boleh dilaksanakan dengan mudah menggunakan fungsi hash_hmac() PHP terbina dalam. Penggunaannya adalah seperti berikut:
//HMAC签名 function hmacSign($data, $secret) { $signed_data = hash_hmac('sha256', $data, $secret, false); return $signed_data; }
Antaranya, $data ialah data yang perlu ditandatangani, dan $secret ialah kunci tandatangan. Panggil fungsi hash_hmac() untuk menyulitkan data dan mengembalikan data yang ditandatangani.
4. Contoh penyulitan dan penyahsulitan data
Seterusnya, kami akan menggunakan kaedah penyulitan dan tandatangan data di atas secara menyeluruh untuk menunjukkan cara menggunakan PHP untuk melengkapkan proses penyulitan dan penyahsulitan parameter permintaan API.
//数据加密 $data = [ 'user_id' => 12345, 'user_name' => 'test', 'timestamp' => time(), ]; $json_data = json_encode($data); $encrypted_data = aesEncrypt($json_data, $encrypt_key); //数据签名 $signature_data = $encrypted_data . $secret_key; $signature = hmacSign($signature_data, $hmac_key); //API请求构造 $params = [ 'data' => $encrypted_data, 'signature'=> $signature, ]; $request_url = 'http://api.example.com' . '?'. http_build_query($params); //API响应解析 $response_data = file_get_contents($request_url); $response_data = json_decode($response_data, true); //数据解密 $encrypted_data = $response_data['data']; $signature_data = $encrypted_data . $secret_key; $signature = $response_data['signature']; if(hmacSign($signature_data, $hmac_key) === $signature) { $json_data = aesDecrypt($encrypted_data, $encrypt_key); $response = json_decode($json_data, true); //TODO:处理API响应数据 } else { //TODO:处理签名不合法的情况 }
Dalam kod di atas, fungsi aesEncrypt() mula-mula digunakan untuk menyulitkan parameter permintaan secara simetri, dan kemudian fungsi hmacSign() digunakan untuk mencincang data yang disulitkan untuk menjana parameter permintaan yang ditandatangani. Selepas pelayan menerima permintaan, ia mengesahkan sama ada tandatangan itu sah dengan mencincang data tandatangan, dan kemudian menggunakan fungsi aesDecrypt() untuk menyahsulit data yang disulitkan untuk mendapatkan parameter permintaan asal.
Dalam proses permohonan sebenar, adalah perlu untuk memastikan bahawa kunci penyulitan, kunci tandatangan dan maklumat lain tidak boleh dibocorkan untuk memastikan keselamatan data API. Pada masa yang sama, penyulitan dan algoritma tandatangan yang sesuai perlu dipilih berdasarkan keperluan penggunaan sistem untuk memenuhi prestasi sistem dan keperluan keselamatan.
Atas ialah kandungan terperinci Cara mengendalikan penyulitan dan penyahsulitan data apabila melaksanakan API dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!