1. 程式人生 > >php中簽名公鑰、私鑰詳解

php中簽名公鑰、私鑰詳解

public spa php pan signature == 業務邏輯 pubkey \n

由於http請求是無狀態,所以我們不知道請求方到底是誰。於是就誕生了簽名,接收方和請求方協商一種簽名方式進行驗證,來取得互相信任,進行下一步業務邏輯交流。

其中簽名用得很多的就是公鑰私鑰,用私鑰簽名,公鑰驗簽,或者公鑰加密,私鑰解密。

不管是公鑰和私鑰,我們首先要進行格式化,當然如果你獲取的就是格式化後的可忽略這一步

1、公鑰私鑰的格式化

********************私鑰格式化********************/

function formatPriKey($priKey) {
    $fKey = "-----BEGIN PRIVATE KEY-----\n";
    
$len = strlen($priKey); for($i = 0; $i < $len; ) { $fKey = $fKey . substr($priKey, $i, 64) . "\n"; $i += 64; } $fKey .= "-----END PRIVATE KEY-----"; return $fKey; } /********************公鑰格式化********************/ function formatPubKey($pubKey) { $fKey = "-----BEGIN PUBLIC KEY-----\n";
$len = strlen($pubKey); for($i = 0; $i < $len; ) { $fKey = $fKey . substr($pubKey, $i, 64) . "\n"; $i += 64; } $fKey .= "-----END PUBLIC KEY-----"; return $fKey; }

格式化也就是加上前後綴,然後每64位進行換行,還可如下簡單格式化:

//私鑰格式化
$fKey = "-----BEGIN PRIVATE KEY-----\n".chunk_split($public_key
, 64,"\n").‘-----END PRIVATE KEY-----‘; //公鑰格式化 $fKey = "-----BEGIN PUBLIC KEY-----\n".chunk_split($public_key, 64,"\n").‘-----END PUBLIC KEY-----‘;

2、私鑰簽名和公鑰驗簽

/********************私鑰簽名********************/
function get_private_sign($sign_str,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $private_key = openssl_pkey_get_private(private_key);//加載密鑰
    openssl_sign($sign_str,$signature,$private_key,$signature_alg);//生成簽名
    $signature = base64_encode($signature);
    openssl_free_key($private_key);
    return $signature;
}
/********************公鑰驗簽********************/
function public_verify($sign_str,$sign,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $public_key = openssl_get_publickey($public_key);
    $verify = openssl_verify($sign_str, base64_decode($sign), $public_key, $signature_alg);
    openssl_free_key($public_key);
    return $verify==1;//false or true
}

$sign_str為簽名字符串或者驗簽字符串,$sign為簽名,公鑰私鑰都必須是格式化後的,否則會無法識別。

3、公鑰加密和私鑰解密

/********************公鑰加密********************/
function get_public_sign($sign_str,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $public_key = openssl_pkey_get_public($public_key);//加載密鑰
    openssl_sign($sign_str,$signature,$public_key,$signature_alg);//生成簽名
    $signature = base64_encode($signature);
    openssl_free_key($public);
    return $signature;
}

/********************私鑰解密********************/
 function private_verify($sign_str,$sign,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $private_key = openssl_get_privatekey($private_key);
    $verify = openssl_verify($sign_str, base64_decode($sign), $private_key, $signature_alg);
    openssl_free_key($private_key);
    return $verify==1;//false or true
}

php中簽名公鑰、私鑰詳解