1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        支付寶是怎么加密支付的?寫的太好了!

        共 2796字,需瀏覽 6分鐘

         ·

        2021-11-21 02:24


        前言

        支付是一個(gè)安全等級(jí)很高的場(chǎng)景,系統(tǒng)間交互的每一條數(shù)據(jù)的泄露都有可能造成及其大的損失。因此支付時(shí)系統(tǒng)間交互的每一條數(shù)據(jù)都會(huì)采取加密措施。
        這里梳理一下支付寶支付時(shí)用到的加密規(guī)則,請(qǐng)大家參考。

        一、什么是簽名?

        在了解簽名前,先回顧一下支付的交互流程。如上圖所示,支付的過程中可以大概分為 6 個(gè)步驟。
        1. 用戶選擇自己的商品提交訂單。
        2. 商家服務(wù)器將商品信息和所需要的金額發(fā)給支付寶,生成支付寶訂單。
        3. 支付寶訂單返回成功之后生成一個(gè)支付頁面,方便手機(jī)支付或者網(wǎng)頁支付。
        4. 手機(jī)調(diào)起支付寶 app 進(jìn)行支付。
        5. 輸入支付密碼發(fā)送給支付寶服務(wù)器。
        6. 支付寶服務(wù)器轉(zhuǎn)賬成功,告知商家服務(wù)器某個(gè)訂單的金額轉(zhuǎn)賬成功。
        這 6 個(gè)步驟中,最為重要的是步驟 2 和步驟 6。拆解如下。
        商家服務(wù)器和支付寶服務(wù)器交互的過程中傳輸?shù)男畔惓C舾?,所以,在交互時(shí)必須防止中間人對(duì)于信息的篡改。例如步驟 2 將商品的金額改為 0,支付寶就誤認(rèn)為是轉(zhuǎn)賬 0 元。
        數(shù)字簽名解決了交互時(shí)這一安全問題。它可以驗(yàn)證一條消息或者文檔的真實(shí)性。在支付寶支付的接口中,有一個(gè) sign 參數(shù)用來填寫簽名。這個(gè)簽名作用是為了防止信息偽造。通過這種方式可以有效的防止消息在傳遞過程中被篡改。

        二、簽名實(shí)現(xiàn)原理

        2.1 簽名原理
        數(shù)字簽名是一個(gè)信息安全的保障,它的實(shí)現(xiàn)依賴于雙方系統(tǒng)的密鑰。
        簽名過程如下:
        1. 計(jì)算希望簽名的文檔的散列。不論輸入文檔的長(zhǎng)度如何,輸出長(zhǎng)度總是固定的。比如,使用 SHA256 就是 256 位。
        2. 對(duì)結(jié)果散列和一些額外的元數(shù)據(jù)進(jìn)行編碼。比如,接收方需要知道你使用的散列算法,否則不能處理簽名。
        3. 使用私鑰加密編碼過的數(shù)據(jù),其結(jié)果就是簽名,可以追加到文檔中作為身份驗(yàn)證的依據(jù)。
        驗(yàn)證簽名(驗(yàn)簽):
        接收方接收文檔并使用相同的散列算法獨(dú)立計(jì)算文檔散列。
        接著,她使用公鑰對(duì)消息進(jìn)行解密,將散列解碼出來,再確認(rèn)使用的散列算法是否正確,解密出的散列是否與本地計(jì)算的相同。
        2.2 非對(duì)稱加密
        支付寶采用 RSA 非對(duì)稱加密對(duì)信息進(jìn)行簽名。
        非對(duì)稱加密是由一個(gè)公鑰和一個(gè)私鑰組成,一般代碼中命名為 public key 和 private key。非對(duì)稱加密的特點(diǎn)是:私鑰加密的信息只有公鑰才能解密,公鑰加密的信息只能有私鑰才能解密。
        一般會(huì)將私鑰進(jìn)行保留,開發(fā)時(shí)一般會(huì)放在配置文件中,安全級(jí)別和數(shù)據(jù)庫(kù)賬號(hào)密碼一樣。公鑰會(huì)交給其它系統(tǒng),這樣系統(tǒng)間交互時(shí)中間人不知道密鑰的情況下,是無法破解交互的信息的。發(fā)送方只要保證私鑰不泄露,任何人發(fā)送給接收方的信息在簽名驗(yàn)證時(shí)都無法匹配成功。
        支付寶的實(shí)現(xiàn)簽名的方式也大致如此,支付寶在信息交互的時(shí)候兩個(gè)很重要的名詞支付寶公鑰和應(yīng)用公鑰,這兩個(gè)秘鑰總是讓人混淆。這是因?yàn)橹Ц秾毺峁┝藘商?RSA 加密。一套是用來保證步驟 2 統(tǒng)一下單接口時(shí)的信息安全,另一套是用來保證步驟 6 回調(diào)時(shí)的信息安全。
        如下圖,步驟 2 商戶服務(wù)器通過紅色應(yīng)用私鑰 (priv key 2) 計(jì)算簽名,支付寶通過紅色應(yīng)用公鑰 (pub key 2) 進(jìn)行驗(yàn)簽;步驟 6 支付寶服務(wù)器通過藍(lán)色支付寶私鑰 (priv key 6) 計(jì)算簽名,商家通過藍(lán)色支付寶公鑰 (pub key 6) 驗(yàn)證簽名。
        了解了簽名計(jì)算原理之后,再去管理平臺(tái)設(shè)置 app 信息的時(shí)候就游刃有余了,我以沙箱環(huán)境為例子。關(guān)注公眾號(hào):Java項(xiàng)目精選
        如上圖,說明使用 RSA2 加密方式,HASH 算法采用 SHA256。進(jìn)入設(shè)置之后要設(shè)置應(yīng)用公鑰和保存支付寶公鑰。
        應(yīng)用公鑰和應(yīng)用私鑰 這兩個(gè)需要自己生成一對(duì),保證步驟2的安全。生成方式跳轉(zhuǎn)支付寶開放平臺(tái)開發(fā)助手
        支付寶公鑰和支付寶私鑰是支付寶提供的,私鑰支付寶自己保留的,和自己服務(wù)器的應(yīng)用私鑰一樣,人家不會(huì)提供出來。公鑰復(fù)制下來用于在回調(diào)時(shí)進(jìn)行簽名的認(rèn)證。

        三、對(duì)稱加密

        簽名雖然可以防止中間人的信息篡改,但是無法防止中間人信息查看。比如步驟 2 中,向支付寶發(fā)送的商品金額,中間人即可獲取每天中該商家交易的金額。信息在網(wǎng)絡(luò)中傳輸感覺是一個(gè)虛無縹緲的過程,網(wǎng)絡(luò)中信息有可能被不法分子進(jìn)行攔截。
        因此在支付的過程中,會(huì)推薦使用 https 協(xié)議進(jìn)行交互,使得交互的信息加密傳輸。而且,支付寶的很多接口還支持使用 AES 加密之后進(jìn)行傳輸,使得信息更加安全。
        AES 加密是一種對(duì)稱加密算法,對(duì)稱加密算法相對(duì)于非對(duì)稱加密要簡(jiǎn)單一點(diǎn)。系統(tǒng)間只存在一個(gè)密鑰,這個(gè)密鑰可以用來加密也可以用來解密。
        在與支付寶交互的信息可以通過 AES 加密。防止信息的泄露,官方對(duì)接口的解釋如下:
        若 OpenAPI 無 bizContent 傳參則無法使用 AES 密鑰加密,否則會(huì)報(bào)錯(cuò) 當(dāng)前 API 不支持加密請(qǐng)求。例如:alipay.user.info.share(支付寶會(huì)員授權(quán)信息查詢接口) 未使用 bizContent 傳參則無法使用 AES 密鑰加密。

        四、AES 和 RSA 關(guān)系

        AES 密鑰是對(duì)接口請(qǐng)求和響應(yīng)內(nèi)容進(jìn)行加密,密文無法被第三方識(shí)別,從而防止接口傳輸數(shù)據(jù)泄露。
        RSA 密鑰是對(duì)接口請(qǐng)求和響應(yīng)內(nèi)容進(jìn)行簽名,開發(fā)者和支付寶開放平臺(tái)分別加簽驗(yàn)簽,以確認(rèn)接口傳輸?shù)膬?nèi)容沒有被篡改。不論接口內(nèi)容是明文還是密文,RSA 均可正常簽名。
        開發(fā)者可對(duì)請(qǐng)求參數(shù)先做 AES 加密,然后對(duì)密文進(jìn)行 RSA 簽名。
        作者:叁滴水
        博客:https://blog.csdn.net/qq_30285985/


        PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。

        ?關(guān)注公眾號(hào):Java后端編程,回復(fù)下面關(guān)鍵字?


        要Java學(xué)習(xí)完整路線,回復(fù)??路線?

        缺Java入門視頻,回復(fù)?視頻?

        要Java面試經(jīng)驗(yàn),回復(fù)??面試?

        缺Java項(xiàng)目,回復(fù):?項(xiàng)目?

        進(jìn)Java粉絲群:?加群?


        PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。

        (完)




        加我"微信"?獲取一份 最新Java面試題資料

        請(qǐng)備注:666,不然不通過~


        最近好文


        1、Kafka 3.0重磅發(fā)布,棄用 Java 8 的支持!

        2、你只會(huì)用 ! = null 判空?嘿嘿!

        3、這次,Swagger-ui遇到對(duì)手了!

        4、上午寫了一段代碼,下午就被開除了...

        5、抖音項(xiàng)目Semi Design涉嫌抄襲?技術(shù)團(tuán)隊(duì)發(fā)文致歉!



        最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊(cè),覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。
        獲取方式:關(guān)注公眾號(hào)并回復(fù)?java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
        明天見(??ω??)??
        瀏覽 103
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩一区二区精品日韩波多野结衣 | 啊啊啊快高潮了短片 | 地铁上的调教高h | 全黄裸片武则天一级 | 久久亚洲无码 | 手机AV在线观看 | 白嫩粗长浓精h宫交 | 啊啊啊少妇 | 91丨九色丨蝌蚪丨丝袜 | 国产freexxxx性播放 |