1. 程式人生 > >php使用openssl進行數字簽名驗證

php使用openssl進行數字簽名驗證

簽名 contents create 個數字 字符 一個 logs php ont

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: hanks
 5  * Date: 6/2/2017
 6  * Time: 6:03 PM
 7  */
 8 /*
 9 【數字簽名】
10 使用完全加密的數據進行傳輸的好處是更加安全,但是計算更加復雜,需要傳輸的數據也更多,
11 更常用的方式只是對要傳輸的數據做一個數字簽名,在接收端對接收到的數據進行一個簽名運算,
12 只要客戶端計算的簽名和接受的的簽名一樣就可以認為收到的數據沒有被篡改過。
13 
14 計算簽名使用openssl提供的openssl_sign(),簽名驗證使用openssl_verify()
15 這兩個函數的函數簽名為: 16 17 bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] ) 18 int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] ) 19 通過參數比較容易理解函數的使用,sign函數第一個函數是一個字符串,所以對數組,
20 對象等簽名需要使用json_encode或者base64_encode等函數編碼一下; 21 第二個參數是&$signature就是函數會把對數據$data的簽名保存在$signature變量。 22 23 註意返回值,第一個函數是bool值,第二個是int,1表示簽名驗證通過, 0表示簽名不正確,-1表示發生錯誤。*/ 24 25 $publicKey = file_get_contents(‘./php-public.key‘); 26 $privateKey = file_get_contents(‘./php-private.key‘); 27 28 $data = [ 29
‘orderId‘ => 100002, 30 ‘pay_time‘ => ‘2015-09-02 10:10:10‘, 31 ‘extra‘=>‘額外的數據‘ 32 ]; 33 $signature = ‘‘; 34 openssl_sign(json_encode($data), $signature, $privateKey); 35 echo ‘sign is: ‘ . base64_encode($signature); 36 37 //這裏做實驗,手動的篡改下orderId的鍵值 38 //$data = [ 39 // ‘orderId‘ => 100003, 40 // ‘pay_time‘ => ‘2015-09-02 10:10:10‘, 41 // ‘extra‘=>‘額外的數據‘ 42 //]; 43 44 $verify = openssl_verify(json_encode($data), $signature, $publicKey); 45 46 echo "\nverify result: $verify";//返回的將是0,即簽名不正確,返回1,表示簽名驗證通過

php使用openssl進行數字簽名驗證