openssl生成簽名與驗證簽名


  繼上一篇RSA對傳輸信息進行加密解密,再寫個生成簽名和驗證簽名。

  一般,安全考慮,比如接入支付平台時,請求方和接收方要互相驗證是否是你,就用簽名來看。

  簽名方式一般兩種,對稱加密和非對稱加密。對稱加密就是雙方互相有一個相同的key。非對稱比如就是公鑰和私鑰。

  利用非對稱openssl,下面是生成簽名和驗證簽名的php示例。

  

<?php

$arrParams = array(
    'z' => 1,
    'a' => 2,
    'n' => "hello",
    'p' => "你好",
    'c' => 0,
);

$sortStr = createString($arrParams);// 有序生成字符串
// echo $sortStr;die;

$sha = sha1($sortStr);// sha1生成摘要
// echo $sha;die;

$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDKEquCt8WfdPFldkwy7GH3P274g4rxT2bFtaAlGKV03NVnZd/o
8+NvHyScilc4Awpp+xv0EJl25qI+OxoFjl0dGFXf8P4E93onPeZYfYtynTkhsFZv
CFYuf0GQW8o7M16d7WDeOKhyf9G/RWWTYYHwFO0uIPDXEgDHfLzf4NsZsQIDAQAB
AoGAUyLZQ19+Q/tl8Xt5IB5Ws9V6P25HNL6ZJtBxwbFhKTJN7ktgksP8l1Q1yN21
woqltzKjrodBzERZDcddDloi/kFCSj0I5rmnfMRifo8PLbv5+F9knxAyBc8Na52w
JLyv5+vqJM5cJ5OBxX055ipssQxBgno7OVJCgP8dY/EGnW0CQQDl9No8cmr3tha0
I9KPHbibwrwT9THBB5oGu3PUqTlBuJixjxGgf0pUm+qHw/r3PG1jNqD9Xx5REoQN
RrfQgLdPAkEA4PVjU8361m8weCUkm4jh/rsa8VYsiDEGCKEM6vmtaBYRlAXSeeb2
P/2MNlwI9bMSjiQ0q/XftHdSz4N+5/Le/wJBALDGBW4qVuiN5e4dC6RRKLU0gfil
qNXGzjUWrPhyDj3jdh4o6VgEAlQAd85ebfLZVQ3L1P5xvJB+N10tW+jAyikCQQCm
jAYlnXIAIAG6cYVQwV7PwKaJ1krR6bmV2eY+cOs5DF2nQUg6iAv4BDcyZ6EahqFO
Ku/z/+zHJzBgAfKKtvzxAkBeT86uZ6tfTNLR72UbP0abWKfE65cTNHGQZKp3Df79
Gx+UKVNiDHnfYmUu412QbpqDqi95XTDiPnry0fGqlzVJ
-----END RSA PRIVATE KEY-----';// 獲取私鑰

$pri_key_id =  openssl_pkey_get_private($private_key);// 可用返回資源id Resource id
//var_dump($pri_key_id);die;

$re = openssl_sign($sha, $signature, $pri_key_id, OPENSSL_ALGO_SHA1);
// var_dump($re);die;

// $signature_base = base64_encode($signature); // 網絡請求,post過去該base64字段,另一端解密
// echo $signature_base;die;


// -----------------驗簽----------------
// 驗簽服務器拿到以上的參數(unset($signature)),同樣生成有序串;sha1();

$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKEquCt8WfdPFldkwy7GH3P274
g4rxT2bFtaAlGKV03NVnZd/o8+NvHyScilc4Awpp+xv0EJl25qI+OxoFjl0dGFXf
8P4E93onPeZYfYtynTkhsFZvCFYuf0GQW8o7M16d7WDeOKhyf9G/RWWTYYHwFO0u
IPDXEgDHfLzf4NsZsQIDAQAB
-----END PUBLIC KEY-----';
$pu_key = openssl_pkey_get_public($public_key);

$verify = openssl_verify($sha, $signature, $pu_key, OPENSSL_ALGO_SHA1);
if($verify == 1){
    echo 'ok';
} else {
    echo 'fail';
}


/**
 * @param $param
 * @return bool|string
 * 生成有序字符串
 */
function createString($param){
    if (!is_array($param) || empty($param)){
        return false;
    }
    ksort($param);
    $concatStr = '';
    foreach ($param as $k=>$v) {
        $concatStr .= $k.'='.$v.'&';
    }
    $concatStr = rtrim($concatStr, '&');
    return $concatStr;
}

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM