支付寶iOS SDK Demo加密解密分析(2)

上一篇文章講了支付寶iOS SDK加密解密的邏輯惠赫,主要是從客戶端開發(fā)的角度分析邑贴。這篇文章會(huì)根據(jù)支付寶服務(wù)端php demo蜂林,來(lái)分析服務(wù)端的加密解密流程。

按照支付的場(chǎng)景须床,當(dāng)用戶支付完成后币呵,客戶端的邏輯就執(zhí)行完了。這個(gè)時(shí)候支付寶會(huì)回調(diào)商家設(shè)置的notifyURL侨颈,這個(gè)值是在客戶端設(shè)置的余赢。

order.notifyURL = @"http://www.xxx.com"; //回調(diào)URL

這個(gè)url是商品自己的服務(wù)端url,用來(lái)處理支付寶的回調(diào)哈垢。這個(gè)回調(diào)URL需要解決兩個(gè)問(wèn)題:

  1. 證明請(qǐng)求是由支付寶發(fā)起的
  2. 證明請(qǐng)求的數(shù)據(jù)在傳輸過(guò)程中沒(méi)有被篡改

其實(shí)這兩個(gè)問(wèn)題在上一篇文章里也已經(jīng)遇到了妻柒,解決方案和上一篇文章也差不多,只不過(guò)這次角色對(duì)調(diào)了耘分。

解決方案:

  1. 支付寶用自己的私鑰將特征碼加密后举塔,將此數(shù)據(jù)發(fā)給商家服務(wù)器,服務(wù)器使用支付寶的公鑰對(duì)密文進(jìn)行解密求泰,如果解密成功可唯一確定這是用支付寶的私鑰加密的密文央渣。
  2. 支付寶對(duì)商品數(shù)據(jù)做SHA1簽名,得到一個(gè)和這個(gè)商品信息唯一相關(guān)的字符串渴频,然后對(duì)這個(gè)字符串加密芽丹,然后將這個(gè)加密后的字符串給商戶服務(wù)器,商戶拿到商品信息和這個(gè)加密后的字符串后卜朗,首先解密拔第,還原為SHA1簽名字符串,然后對(duì)商品信息進(jìn)行SHA1簽名场钉,對(duì)比這兩個(gè)SHA1簽名字符串蚊俺,如果相等,那么這個(gè)商品一定沒(méi)有被篡改過(guò)逛万。因?yàn)槿绻畔⒈淮鄹挠锯敲催@個(gè)SHA1簽名肯定不一樣;如果有人想要偽造這個(gè)SHA1簽名宇植,又需要私鑰得封,所以這就保證了這個(gè)商品是支付寶發(fā)的。

原理清楚了当纱,我們看看支付寶提供的php demo是怎么具體處理的呛每。

//notify.php

//計(jì)算得出通知驗(yàn)證結(jié)果
$alipayNotify = new AlipayNotify($alipay_config);
if($alipayNotify->getResponse($_POST['notify_id']))//判斷成功之后使用getResponse方法判斷是否是支付寶發(fā)來(lái)的異步通知。
{
    if($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) {//使用支付寶公鑰驗(yàn)簽
        

這里通過(guò)調(diào)用getSignVeryfy坡氯,用支付寶公鑰驗(yàn)簽

//alipay_notify.class.php

/**
 * 獲取返回時(shí)的簽名驗(yàn)證結(jié)果
 * @param $para_temp 通知返回來(lái)的參數(shù)數(shù)組
 * @param $sign 返回的簽名結(jié)果
 * @return 簽名驗(yàn)證結(jié)果
 */
function getSignVeryfy($para_temp, $sign) {
    //除去待簽名參數(shù)數(shù)組中的空值和簽名參數(shù)
    $para_filter = paraFilter($para_temp);
    
    //對(duì)待簽名參數(shù)數(shù)組排序
    $para_sort = argSort($para_filter);

    //把數(shù)組所有元素晨横,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
    $prestr = createLinkstring($para_sort);
    
    $isSgin = false;
    switch (strtoupper(trim($this->alipay_config['sign_type']))) {
        case "RSA" :
            $isSgin = rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign);
            break;
        default :
            $isSgin = false;
    }
    
    return $isSgin;
}

這里通過(guò)rsaVerify($data, $alipay_public_key, $sign)完成驗(yàn)簽洋腮,$data是待簽名數(shù)據(jù),它是把_POST數(shù)組所有元素手形,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串啥供,也就是所有的商品參數(shù)。$alipay_public_key是支付寶的公鑰字符串库糠,$sign是要要校對(duì)的的簽名結(jié)果伙狐,它的值是通過(guò)$_POST['sign']獲取的。函數(shù)實(shí)現(xiàn)如下

/**
 * RSA驗(yàn)簽
 * @param $data 待簽名數(shù)據(jù)
 * @param $alipay_public_key 支付寶的公鑰字符串
 * @param $sign 要校對(duì)的的簽名結(jié)果
 * return 驗(yàn)證結(jié)果
 */
function rsaVerify($data, $alipay_public_key, $sign)  {
    //以下為了初始化私鑰瞬欧,保證在您填寫私鑰時(shí)不管是帶格式還是不帶格式都可以通過(guò)驗(yàn)證贷屎。
    $alipay_public_key=str_replace("-----BEGIN PUBLIC KEY-----","",$alipay_public_key);
    $alipay_public_key=str_replace("-----END PUBLIC KEY-----","",$alipay_public_key);
    $alipay_public_key=str_replace("\n","",$alipay_public_key);

    $alipay_public_key='-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($alipay_public_key, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----';
    $res=openssl_get_publickey($alipay_public_key);
    if($res)
    {
        $result = (bool)openssl_verify($data, base64_decode($sign), $res);
    }
    else {
        echo "您的支付寶公鑰格式不正確!"."<br/>"."The format of your alipay_public_key is incorrect!";
        exit();
    }
    openssl_free_key($res);    
    return $result;
}

這里通過(guò)openssl_verify(),完成驗(yàn)簽艘虎。

openssl_verify() verifies that the signature is correct for the specified data using the public key associated with pub_key_id. This must be the public key corresponding to the private key used for signing.

如果驗(yàn)簽成功唉侄,執(zhí)行業(yè)務(wù)邏輯代碼,比如訂單狀態(tài)變更等野建;否則属划,提示錯(cuò)誤信息。

總結(jié):

通過(guò)RSA加密候生,支付寶保證了數(shù)據(jù)的安全傳遞同眯。類似地,如果需要實(shí)現(xiàn)客戶端和服務(wù)器加密傳輸唯鸭,我們可以采用類似的策略须蜗,來(lái)保證數(shù)據(jù)的安全傳輸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肿孵,一起剝皮案震驚了整個(gè)濱河市唠粥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌停做,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大莫,死亡現(xiàn)場(chǎng)離奇詭異蛉腌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)只厘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門烙丛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人羔味,你說(shuō)我怎么就攤上這事河咽。” “怎么了赋元?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵忘蟹,是天一觀的道長(zhǎng)飒房。 經(jīng)常有香客問(wèn)我,道長(zhǎng)媚值,這世上最難降的妖魔是什么狠毯? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮褥芒,結(jié)果婚禮上嚼松,老公的妹妹穿的比我還像新娘。我一直安慰自己锰扶,他們只是感情好献酗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坷牛,像睡著了一般罕偎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漓帅,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天锨亏,我揣著相機(jī)與錄音,去河邊找鬼忙干。 笑死器予,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捐迫。 我是一名探鬼主播乾翔,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼施戴!你這毒婦竟也來(lái)了反浓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赞哗,失蹤者是張志新(化名)和其女友劉穎雷则,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肪笋,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡月劈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了藤乙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猜揪。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坛梁,靈堂內(nèi)的尸體忽然破棺而出而姐,到底是詐尸還是另有隱情,我是刑警寧澤划咐,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布拴念,位于F島的核電站钧萍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丈莺。R本人自食惡果不足惜划煮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缔俄。 院中可真熱鬧弛秋,春花似錦、人聲如沸俐载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遏佣。三九已至挖炬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間状婶,已是汗流浹背意敛。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膛虫,地道東北人草姻。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稍刀,于是被迫代替她去往敵國(guó)和親介袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扎运,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容