簡體   English   中英

我怎樣才能在Haskell中對一個字符串的SHA256哈希進行Base64 UrlEncode?

[英]How can I Base64 UrlEncode a SHA256 Hash of a string in Haskell?

這是為PKEC OAuth工作流創建代碼質詢和驗證程序。

以下似乎應該工作(使用cryptonite ):

import System.Random (newStdGen, randomRs)
import Crypto.Hash (Digest, hash)
import Crypto.Hash.Algorithms (SHA256)

x = do
    gen <- newStdGen
    codeVerifier = C.pack . take 128 $ randomRs ('0', 'z') gen
    codeChallenge = show (hash codeVerifier :: Digest SHA256)
    print codeChallenge

但唉,事實並非如此。 所以我會發布我經過多次痛苦和辛勞后終於解決的答案。

而OAuth工作流程所期望的答案是......滾動~~~

import System.Random (newStdGen, randomRs)
import Data.ByteArray.Encoding
import Crypto.Hash.Algorithms
import Crypto.Hash

-- | This is a custom sort of urlEncode that simply replaces bad characters
urlEncode :: String -> String
urlEncode [] = ""
urlEncode ('=':xs) = urlEncode xs
urlEncode ('+':xs) = '-' : urlEncode xs
urlEncode ('/':xs) = '_' : urlEncode xs
urlEncode (x : xs) = x : urlEncode xs

codeVerifier = C.pack . take 128 $ randomRs ('a', 'z') gen
codeChallenge = urlEncode . C.unpack $ (convertToBase Base64 (hashWith SHA256 codeVerifier)  :: ByteString)

OP代碼中的問題是base64對String編碼,其中此代碼等待將哈希值轉換為String ,因此您實際上將hash64直接編碼為ByteArray

無論如何,這踢了我的屁股,特別是因為我使用的auth服務堅持我的錯誤是invalid_grant 它一直在告訴我,我有一個invalid_grant ?! 無論如何,我突然出現了幾條白發,所以我想幫助下一個不幸的靈魂。

暫無
暫無

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

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