欧美日韩国产一区,亚洲一区视频,色综合久久久久,私密按摩师舌头伸进去了,99re6这里只有精品,夜夜性日日交xxx性hd

7:用戶數(shù)據(jù)簽名詳解(加解密、簽名系列)

  • • 發(fā)表于 8年前
  • • 作者 Roluce
  • • 7681 人瀏覽
  • • 2 條評(píng)論
  • • 最后編輯時(shí)間 8年前
  • • 來(lái)自 [技 術(shù)]

原創(chuàng)聲明:本文為作者原創(chuàng),未經(jīng)允許不得轉(zhuǎn)載,經(jīng)授權(quán)轉(zhuǎn)載需注明作者和出處

1:為什么要做簽名


由上圖可知:有三個(gè)傳輸過程:

1:微信服務(wù)器A與小程序B之間的數(shù)據(jù)傳輸
2:小程序B與自己服務(wù)器C之間的數(shù)據(jù)傳輸
3:微信服務(wù)器A與自己服務(wù)器C之間的數(shù)據(jù)傳輸


破壞數(shù)據(jù)完整性的原因:

正常來(lái)說(shuō),數(shù)據(jù)從A傳輸?shù)紹,再到C,ABC三點(diǎn)的數(shù)據(jù)都是一樣的。
但也許是不一致的,比如:
1:http傳輸過程中因?yàn)檐浖蛴布栴}造成數(shù)據(jù)丟失一部分。
2:黑客攔截?cái)?shù)據(jù)、修改數(shù)據(jù)、繼續(xù)發(fā)送數(shù)據(jù)。
3:等等等


數(shù)據(jù)簽名的原因:

如果不做任何措施,從B發(fā)出數(shù)據(jù)data,傳輸過程中“丟失部分?jǐn)?shù)據(jù)”或”被黑客修改數(shù)據(jù)”,然后C接收到數(shù)據(jù)data2

在C不知道接收的數(shù)據(jù)data2是否和B發(fā)出的數(shù)據(jù)data是否一致,
如果把不一致的數(shù)據(jù)當(dāng)做正確的數(shù)據(jù)繼續(xù)操作,將會(huì)出現(xiàn)各種安全性的問題。

為了讓C知道:接收的數(shù)據(jù)是否和B發(fā)出的數(shù)據(jù)是否一致,所以采取了簽名的機(jī)制。


數(shù)據(jù)完整、安全的重要性:
比如:你去銀行取錢,營(yíng)業(yè)員從“遠(yuǎn)程服務(wù)器”查詢你的“賬戶余額”。
“遠(yuǎn)程服務(wù)器”發(fā)送過來(lái)1000元,你讓“同伙”劫持?jǐn)?shù)據(jù),把這1000元改成5000元,并發(fā)送給營(yíng)業(yè)員。如果此時(shí)沒有做數(shù)據(jù)完整性校驗(yàn),營(yíng)業(yè)員收到你的余額就是5000元,他就給你5000元。本來(lái)你余額為1000元,結(jié)果給你5000元。
這僅僅是一個(gè)例子,在不同的應(yīng)用場(chǎng)合,如果不做數(shù)據(jù)完整性校驗(yàn),會(huì)出現(xiàn)各種問題。
所以,數(shù)據(jù)的安全、完整性很重要,所以敏感的數(shù)據(jù)必須做簽名驗(yàn)證。


2:有簽名的數(shù)據(jù)傳輸與判定

現(xiàn)以上圖中BC之間傳輸為例,說(shuō)明具體數(shù)據(jù)傳輸過程:

一:BC先約定好三點(diǎn):
1:“簽名算法”
2:“密鑰”(一般是隨機(jī)生成復(fù)雜的字符串)
3:“算法參數(shù)的組裝規(guī)則”(簡(jiǎn)稱’參規(guī)’)

(為了防止密鑰的泄露,此密鑰僅用于本地,不能在網(wǎng)絡(luò)傳輸,以防劫持)

二:在B執(zhí)行:簽名算法( 參規(guī)(原始數(shù)據(jù),密鑰) )=簽名
三:從B發(fā)出“原始數(shù)據(jù)”和“簽名”到C
四:網(wǎng)絡(luò)傳輸過程(安全的或者數(shù)據(jù)丟失或者黑客劫持)
五:C接收到“待定數(shù)據(jù)”和“簽名”
六:在C執(zhí)行:簽名算法( 參規(guī)(待定數(shù)據(jù),密鑰) )=新簽名

判定:
1:如果接收的簽名=新簽名,就說(shuō)明數(shù)據(jù)完整、安全(待定數(shù)據(jù)=原始數(shù)據(jù))
2:如果接收的簽名!=新簽名,說(shuō)明待定數(shù)據(jù)異常、不安全(待定數(shù)據(jù)!=原始數(shù)據(jù))


由上邊可知:小程序和開發(fā)者的三點(diǎn)約定為:
1:簽名算法為:sha1
2:密鑰為:session_key
3:算法參數(shù)的組裝規(guī)則:“原始數(shù)據(jù)字符串”連接“密鑰字符串”
(注:小程序用的規(guī)則如上,比較簡(jiǎn)單。還可以隨意約定規(guī)則,比如:數(shù)據(jù)+密鑰+*#abc等)

所以小程序生成簽名的公式:
sha1(原始數(shù)據(jù)+session_key)=signutrue
注:官方文檔中的rawData指的就是“原始數(shù)據(jù)”,raw英文為“原始的,未被加工的意思”


數(shù)據(jù)從B發(fā)送到C的全部情況(四種):

1:傳輸過程中,一切正常。

在B:簽名算法(數(shù)據(jù)+密鑰)=簽名,發(fā)出“數(shù)據(jù)”、”簽名”
傳輸過程:”數(shù)據(jù)”沒變,“簽名”沒變
在C:簽名算法(數(shù)據(jù)+密鑰)=簽名
結(jié)果:簽名==簽名,可以判定數(shù)據(jù)安全

2:傳輸過程中,黑客修改了“數(shù)據(jù)”

在B:簽名算法(數(shù)據(jù)+密鑰)=簽名,發(fā)出“數(shù)據(jù)”、”簽名”
傳輸過程:黑客修改了”數(shù)據(jù)”變?yōu)椤睌?shù)據(jù)2”,“簽名”沒變
在C:簽名算法(數(shù)據(jù)2+密鑰)=簽名2
結(jié)果:簽名!=簽名2,可以判定數(shù)據(jù)不安全

3:傳輸過程中,黑客修改了“密鑰”

在B:簽名算法(數(shù)據(jù)+密鑰)=簽名,發(fā)出“數(shù)據(jù)”、”簽名”
傳輸過程:黑客修改了”簽名”變?yōu)椤焙灻?”,“數(shù)據(jù)”沒變
在C:簽名算法(數(shù)據(jù)+密鑰)=簽名
結(jié)果:簽名2!=簽名,可以判定數(shù)據(jù)不安全

4:傳輸過程中,黑客修改了“數(shù)據(jù)和密鑰”

在B:簽名算法(數(shù)據(jù)+密鑰)=簽名,發(fā)出“數(shù)據(jù)”、”簽名”
傳輸過程:黑客修改了”數(shù)據(jù)和簽名”變?yōu)椤睌?shù)據(jù)2和簽名2”
在C:簽名算法(數(shù)據(jù)2+密鑰)=簽名3
結(jié)果:簽名2和簽名3有幾率相等,什么情況下相等呢?

因?yàn)樵贑,簽名算法(數(shù)據(jù)2+密鑰)=簽名3
只有黑客獲取密鑰,在傳輸過程中也執(zhí)行,簽名算法(數(shù)據(jù)2+密鑰)=簽名2
簽名2才等于簽名3。
因?yàn)闉榱朔乐姑荑€的泄露,此密鑰僅用于本地,不在網(wǎng)絡(luò)傳輸,所以黑客無(wú)法獲取密鑰。
結(jié)果:簽名2!=簽名3,可以判定數(shù)據(jù)不安全。


3:signature簽名僅檢驗(yàn)”基本信息”的完整性


B1的簽名相關(guān)數(shù)據(jù)為:
1:rawData
2:signature


通過console.log()打印的rawData的數(shù)據(jù)為:

"{"nickName":"三石","gender":1,"language":"en","city":"Liaocheng","province":"Shandong","country":"CN", "avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJX1ic14jrA6pbgCw2r8PxlmOtAr5zlvE4icfvwRvelsFAya13PscYatzERE29wia7A1R53fy3QwJxgg/0"}"

結(jié)論1:(由rawData的數(shù)據(jù)信息)

rawData的數(shù)據(jù)僅包含基本信息的數(shù)據(jù),userInfo內(nèi)的信息永遠(yuǎn)是保持一致的。
只是格式不一樣,一個(gè)是JSON字符串,一個(gè)是對(duì)象。

結(jié)論2:(由rawData的數(shù)據(jù)信息)

在微信服務(wù)器簽名signature的生成過程為:
signature=sha1(rawData,session_key)
所以signature只能保證基本信息的數(shù)據(jù)完整性和安全性。

結(jié)論3:(由rawData的數(shù)據(jù)信息)

**encryptedData與iv也需要單獨(dú)的檢驗(yàn)數(shù)據(jù)完整性
具體方法見此文:
8:用戶敏感信息完整性檢驗(yàn)(加解密、簽名系列)


4:“用戶基本信息”的數(shù)據(jù)簽名校驗(yàn)

通常是在自己服務(wù)器后臺(tái)做驗(yàn)證通常是在自己服務(wù)器后臺(tái)做驗(yàn)證

微信服務(wù)器端的響應(yīng):

小程序調(diào)用wx.getUserInfo()時(shí),微信服務(wù)器
通過原始數(shù)據(jù),session_key生成簽名發(fā)送給小程序。
即:sha1( 原始數(shù)據(jù)+ session_key )=signature


開發(fā)者的操作為:

1:先獲取session_key(傳送門)
2:把小程序端調(diào)用wx.getUserInfo()獲取數(shù)據(jù)中的 rawData(原始數(shù)據(jù))、signature,用wx.request()發(fā)送到自己的服務(wù)器。
3:在服務(wù)器后臺(tái),接收傳送來(lái)的rawData(原始數(shù)據(jù))、signature。使用相同的算法計(jì)算出簽名signature2
即:sha1( rawData+ session_key )=signature2
結(jié)果:
比對(duì) signature 與 signature2 即可校驗(yàn)數(shù)據(jù)的完整性。


算法參數(shù)的組裝規(guī)則的例子:

由官方文檔知道:
sha1( rawData+ session_key )=signature
即sha1的參數(shù)為:rawData字符串“連接”sesson_key字符串。

如wx.getUserInfo的數(shù)據(jù)校驗(yàn):
接口返回的rawData:

{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0" }


用戶的 session-key:
HyVFkGl5F5OQWJZZaNzBBg==
所以,用于簽名的字符串為:

{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0" }HyVFkGl5F5OQWJZZaNzBBg==

使用sha1得到的結(jié)果為:
75e81ceda165f4ffa64f4068af58c64b8f54b88c


5:全部代碼實(shí)現(xiàn)(PHP后臺(tái)版)

0:test.wxml(小程序)

 <button bindtap="tap">tap</button>

1:test.js(小程序)

Page({

  tap: function () {

    //調(diào)用登錄接口
    wx.login({
      success: function (login) {

        //成功,返回登錄憑證js_code
        var js_code = login.code;

        //調(diào)用獲取用戶信息接口
        wx.getUserInfo({
          success: function (res) {

            //獲取原始數(shù)據(jù) 
            var rawData = res.rawData;
            //獲取簽名
            var signature = res.signature;

            //調(diào)用網(wǎng)絡(luò)請(qǐng)求接口,把數(shù)據(jù)發(fā)送給服務(wù)器
            wx.request({
              url: 'http://www.yoururl.com/test.php',
              data: {
                js_code: js_code,       //js_code用戶獲取session_key
                rawdata: rawData,      //原始數(shù)據(jù)
                signature: signature,  //簽名
              },
              method: 'GET', //用Get的請(qǐng)求方式
              header: {
                'content-type': 'application/json'
              },
              success: function (data) {

                //成功,返回signature,signature2數(shù)據(jù)
                console.log(data);
              }
            })
          }
        })
      }
    });
  }

})

2:PHP后臺(tái)實(shí)現(xiàn)代碼

<?php

 /*1:獲取session_key********************************/

    //AppID(小程序ID)
    $APPID= "wx138cb91a9900af75"; 

    //AppSecret(小程序密鑰)
    $SECRET = "0d082ea09511df65ef3f2300fdbe0147"; 

    //接收小程序端發(fā)來(lái)的js_code
    $js_code = $_GET[js_code];

    //小程序接口(appid+secret+js_code=sessionId+openId)
    $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$APPID}&secret={$SECRET}&js_code={$js_code}&grant_type=authorization_code";


    //模擬網(wǎng)頁(yè)的GET請(qǐng)求
    $timeout = 5; 
    $ch = curl_init();                              //初始化curl   
    curl_setopt($ch, CURLOPT_URL, $url);            //設(shè)置訪問的url地址   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    //參數(shù)為1表示傳輸數(shù)據(jù),為0表示直接輸出顯示。 
    curl_setopt($ch, CURLOPT_HEADER, 0);            //參數(shù)為0表示不帶頭文件,為1表示帶頭文件  

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);   //獲取https需要加上此
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);   //獲取https需要加上此

    $json_data = curl_exec($ch);   //執(zhí)行命令并把獲取的數(shù)據(jù)賦值給$output
    curl_close($ch);            //關(guān)閉URL請(qǐng)求   


    //返回的Json數(shù)據(jù)轉(zhuǎn)換成php對(duì)象 
    $obj = json_decode($json_data);

    //獲得session_key
    $session_key =$obj->session_key;  

 /*2:校驗(yàn)數(shù)據(jù)有效性********************************/

      //獲取小程序發(fā)送來(lái)的簽名signature
     $signature = $_GET['signature']; 

     //獲取小程序發(fā)送來(lái)的原始數(shù)據(jù)rawData
     $rawdata = $_GET['rawdata'];    

    //生成signature2
    $signature2 = sha1($rawdata.$session_key);

    //生成鍵值對(duì)數(shù)組,用于轉(zhuǎn)換為Json數(shù)組發(fā)送給小程序
    $arr = ["signature"=>$signature,"signature2"=>$signature2];

    //鍵值對(duì)數(shù)組轉(zhuǎn)換為json數(shù)組
    $arr_json = json_encode($arr);

    //發(fā)送給小程序,在wx.request()的sucess方法接收
    echo $arr_json;



?>
分享到:
2條評(píng)論
Ctrl+Enter
作者

Roluce

Roluce

APP:0 帖子:50 回復(fù):112 積分:3610

已加入社區(qū)[3101]天

山東_聊城_qq:635068

作者詳情》
Top