2017-03-02 32 views
3

我试图在榆树实现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,
,我想知道为什么。

回答

3

看着Elm SHA库,我认为问题(或者至少是一个问题)是散列输出是十六进制编码的。 HMAC调用哈希函数两次,将第一个输出提供回第二个调用,这需要是原始SHA字节,而不是十六进制字符串。

因此,您需要将第一次调用的十六进制输出解码为hasher,然后将其应用于partA

+1

谢谢!这绝对是问题之一。还不是很不幸...我已经更新了我的代码。这对你看起来好吗? – Icid

+0

好吧,我的一个好友采取了另一种方式,并使'partB'成为一个十六进制编码的字符串,这似乎工作。奇怪的是,我的崇拜解决方案不起作用,但......无论如何,这绝对是唯一的问题。再次感谢! – Icid

+0

不客气!很高兴你终于工作了。如果您使用“0x”前缀,我会看到SHA库接受十六进制输入,所以我想这就是您的意思。 –