如何在Elm中构建HMAC代码?
问题描述:
我试图在榆树实现HMAC,
但我似乎无法弄清楚我在这里做错了什么。
一些帮助,将不胜感激如何在Elm中构建HMAC代码?
type alias HashFunction =
String -> String
encrypt64 : HashFunction -> String -> String -> String
encrypt64 =
encrypt 64
encrypt : Int -> HashFunction -> String -> String -> String
encrypt blockSize hasher message key =
let
keySize =
String.length key
keyWithCorrectSize =
if keySize > blockSize then
hexStringToUtf8String (hasher key)
else if keySize < blockSize then
String.padRight blockSize (Char.fromCode 0) key
else
key
keyCodePoints =
keyWithCorrectSize
|> String.toList
|> List.map Char.toCode
partA =
keyCodePoints
|> List.map (Bitwise.xor 54 >> Char.fromCode)
|> String.fromList
partB =
keyCodePoints
|> List.map (Bitwise.xor 92 >> Char.fromCode)
|> String.fromList
in
message
|> String.append partA
|> hasher
|> hexStringToUtf8String
|> String.append partB
|> hasher
-- Utils
hexStringToUtf8String : String -> String
hexStringToUtf8String input =
input
|> String.toList
|> List.Extra.greedyGroupsOf 2
|> List.map (String.fromList >> hexStringToUtf8Char)
|> String.fromList
hexStringToUtf8Char : String -> Char
hexStringToUtf8Char input =
case Hex.fromString input of
Ok v ->
Char.fromCode v
Err err ->
Debug.crash err
你可以在这里找到相关的代码:https://github.com/icidasset/ongaku-ryoho/blob/master/src/App/Sources/Crypto/Hmac.elm(包括文档测试)
编辑:更清晰......我当前的代码在这里没有按输出一个有效的HMAC,
,我想知道为什么。
答
看着Elm SHA库,我认为问题(或者至少是一个问题)是散列输出是十六进制编码的。 HMAC调用哈希函数两次,将第一个输出提供回第二个调用,这需要是原始SHA字节,而不是十六进制字符串。
因此,您需要将第一次调用的十六进制输出解码为hasher
,然后将其应用于partA
。
谢谢!这绝对是问题之一。还不是很不幸...我已经更新了我的代码。这对你看起来好吗? – Icid
好吧,我的一个好友采取了另一种方式,并使'partB'成为一个十六进制编码的字符串,这似乎工作。奇怪的是,我的崇拜解决方案不起作用,但......无论如何,这绝对是唯一的问题。再次感谢! – Icid
不客气!很高兴你终于工作了。如果您使用“0x”前缀,我会看到SHA库接受十六进制输入,所以我想这就是您的意思。 –