在Haskell中生成HMAC :: SHA256.hexdigest

时间:2014-07-19 12:26:51

标签: haskell

我想知道,什么方法相当于Ruby中的HMAC :: SHA256.hexdigest?我跑过http://hackage.haskell.org/package/SHA-1.6.4.1/docs/Data-Digest-Pure-SHA.html,但很难搞清楚。在Ruby中,它可以用作:

HMAC::SHA256.hexdigest(secret, nonce.to_s +client_id + api_key)

2 个答案:

答案 0 :(得分:6)

此示例代码有效:

{-# LANGUAGE OverloadedStrings #-}

import Data.Digest.Pure.SHA

main = do
  let a = sha256 "some test message"
      b = hmacSha256 "key" "some test message"
  mapM_ print [showDigest a, showDigest b]

ghci中的演示:

λ> main
"3cb0603701548a84d3e7408a805e270a094000f537b96a6e83a36271a3ff192f"
"a5a36db81683537aacf8b6283121ffdb949ece609abbfe8a5fbc91cc76031edd"

答案 1 :(得分:2)

您也可以使用crypto-api中的Crypto.HMAC

Crypto.Hash.CryptoAPI Crypto.HMAC> hmac (MacKey "hello") "goodbye" :: SHA512
SHA512 "V]\163\146\166M\199\DLE\201\&5\163\DC17LF\246\150>\141\\*\197Q\198\203\233\235\&1&\b\245\SI\172Zc.\243\218\243\&9\224\172\215y\179|\240L\137\192M \167f\246\235\FS\188\231P(\245\ETXZ"

编辑:完全相同的代码可以为其他哈希产生HMAC,这要归功于所使用的函数是多态的。例如:

> simpleHex $ encode (hmac (MacKey "hello") "goodbye" :: SHA256)
"81 48 a0 89  d1 69 a8 9a  3e f0 b2 2a  6e b9 ab c1  d5 7e 70 73  a7 37 c9 0a  03 78 cf 2c  4e 39 94 de"

(注意cereal包的可选但非常好的编码使用和simple-hex的十六进制输出