如何在 Elm 中构建 HMAC 代码?
How do I build a HMAC code in Elm?
我正在尝试在 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
。
我正在尝试在 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
。