簡體   English   中英

Python 和 Haskell 之間的不同 utf8 編碼輸出

[英]different utf8 encoding outputs between Python and Haskell

我正在嘗試對由 Haskell 中的 hmac sha256 計算的 has 進行編碼,有時與 Python 對應的函數相比,我的函數具有不同的輸出。

這是python函數:

import requests
import json
import hmac
import hashlib
import base64
import time

def strToSign(time, method, endpoint, body):
    return time + method + endpoint + body

str_to_sign2 = strToSign('1','GET','/api/v1/position?symbol=XBTUSDM','')

signature2 = base64.b64encode(
    hmac.new(api_secret.encode('utf-8'), str_to_sign2.encode('utf-8'), hashlib.sha256).digest())

這是 Haskell 函數:

import qualified Data.ByteString.Char8      as BC
import qualified Data.Text                  as T
import qualified Data.ByteString.Base64.URL as U
import           Data.Text.Encoding         (encodeUtf8)
import qualified Crypto.Hash.SHA256         as H

apiSignTest :: BC.ByteString -> BC.ByteString -> BC.ByteString -> BC.ByteString -> IO BC.ByteString
apiSignTest time method endpoint body = do
  let timeStamp = time
  let secret = mconcat [timeStamp,method,endpoint,body]
  let hash = H.hmac (BC.pack C.apiSecretFuture) secret
  return $ (encodeUtf8 . U.encodeBase64) hash

編碼輸出不同的一些示例

Haskell : b'KbCFw8OYGeGB433L93vQvbsnzSXxG88r_-HR5AGDJmo='
Python : "KbCFw8OYGeGB433L93vQvbsnzSXxG88r/+HR5AGDJmo=" 

Python : b'dwSmCd75wZToIDt6I0Ik/sX8Vxk4W+RA0Sv1TO+x4WI='
Haskell : "dwSmCd75wZToIDt6I0Ik_sX8Vxk4W-RA0Sv1TO-x4WI="

Python : b'X8SE3ohju6VAu2Dt5nGIQP40+KU9RrhXORAUOdL7rJg='
Haskell : "X8SE3ohju6VAu2Dt5nGIQP40-KU9RrhXORAUOdL7rJg="

Data.ByteString.Base64.URL.encodeBase64專門使用base64url編碼而不是 vanilla base64。 顧名思義,目的是這些編碼可以直接嵌入到 URL 中,而 vanilla 版本不能,因為/+在 URL 中具有特殊含義。

要獲得與 Python 的b64encode相同的行為,請改用Data.ByteString.Base64.encodeBase64 或者,反過來,在 Python 中,您可以使用urlsafe_b64encode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM