shop_platform - 串接藍新金流:TradeSha

(本文使用的語言為 python 3)

文件:藍新金流 > API 文件下載 > 多功能收款 MPG。我下載時,版本是 1.6

TradeSha 是什麼

根據文件第 33 頁的第一個表格,需要傳送給藍新金流的參數共有四個,其中一個就是 TradeSha:

根據文件第 70 頁,得到 TradeSha 的方法,是把 TradeInfo 前面加上 HashKey,後面加上 HashIV,然後用 SHA256 做雜湊,接著把所有英文字母轉成大寫。這樣就是合格的 TradeSha。

test case 為:

trade_info = 'ff91c8aa01379e4de621a44e5f11f72e4d25bdb1a18242db6cef9ef07d80b0165e476fd1d9acaa53170272c82d122961e1a0700a7427cfa1cf90db7f6d6593bbc93102a4d4b9b66d9974c13c31a7ab4bba1d4e0790f0cbbbd7ad64c6d3c8012a601ceaa808bff70f94a8efa5a4f984b9d41304ffd879612177c622f75f4214fa'
key = '12345678901234567890123456789012'
iv = '1234567890123456'
expect_output = 'EA0A6CC37F40C1EA5692E7CBB8AE097653DF3E91365E6A9CD7E91312413C7BB8'

TradeSha 的作用,我猜是藍新金流用來檢查他們收到的 TradeInfo 是否有被篡改。如果有被篡改,他們自己對 TradeInfo 雜湊後的結果,會跟我們傳過去的 TradeSha 值不同。

實作

from Crypto.Hash import SHA256
  
def get_trade_sha(trade_info: str, key: str = HashKey, iv: str = HashIV) -> str:
    # 串接 HashKey、TradeSha、HashKey
    msg = f'HashKey={key}&{trade_info}&HashIV={iv}'
    
    # 雜湊
    h = SHA256.new()
    h.update(msg.encode('ascii'))
    return h.hexdigest().upper()  # 英文字母轉大寫

我一開始眼殘,以為串接的方式是 query string 的格式,後來發現不太一樣,因為 TradeSha 那一段不是 key=value 的結構。

之前為了雜湊使用者的密碼,安裝了 passlib,試著用 passlib.hash.sha256_crypt 做雜湊,結果雜湊出來的東西根本不對啊。後來想想,人家那是為了雜湊密碼而設計的,又加鹽,還會在最開頭紀錄 rounds 等等資訊,就算每次做雜湊的內容相同,雜湊出來的結果還是會不同。我簡直是腦袋抽筋,才會想拿 passlib 做這個工作。

搜尋 python 3 做 SHA256 雜湊的方式,查到的套件是 hashlib。但是之前為了加密 TradeInfo 而安裝的 pycryptodome,我在試著讀原始碼的時候剛好瞥到 HASH 這個字,就也試著搜尋了「pycryptodome SHA256」,看能不能用現有的套件就完成需求。結果還真的有 Crypto.Hash.SHA256,這樣就不用安裝新套件了,真是可喜可賀。

commit

Comments

Popular posts from this blog

Alpha Camp 全端開發課程學習心得

在 javascript 用 regular expression 為金額加上千位數分隔符號

shop_platform - sqlalchemy.exc.TimeoutError