Clojure SHA256 HMAC功能无法产生预期结果

时间:2013-03-15 23:36:57

标签: character-encoding clojure javax.crypto

我有以下Clojure代码:

(ns myproject.hmac-sha256
    (:import (javax.crypto Mac)
             (javax.crypto.spec SecretKeySpec)))

(defn secretKeyInst [key mac]
    (SecretKeySpec. (.getBytes key) (.getAlgorithm mac)))

(defn toString [bytes]
    "Convert bytes to a String"
    (String. bytes "UTF-8"))

(defn sign [key string]
    "Returns the signature of a string with a given 
    key, using a SHA-256 HMAC."
    (let [mac (Mac/getInstance "HMACSHA256")
          secretKey (secretKeyInst key mac)]
          (-> (doto mac
                (.init secretKey)
                (.update (.getBytes "UTF-8")))
              .doFinal
              toString)))

当我在REPL中使用sign函数时,会输出奇怪的字形:

(sign "key" "The quick brown fox jumps over the lazy dog")
"*��`��n�S�F�|�؏�o�r���"

而我期待f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 <{3}}

这无疑是一个字符串编码问题,但我对编码并不是很了解。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

要将输出放入可与示例进行比较的格式,请不要调用上面定义的toString,而是将.doFinal的结果视为字节数组并以十六进制格式打印。上面的示例是签署字符串“UTF-8”而不是输入字符串:

 (defn sign [key string]
  "Returns the signature of a string with a given
    key, using a SHA-256 HMAC."
  (let [mac (Mac/getInstance "HMACSHA256")
        secretKey (secretKeyInst key mac)]
    (-> (doto mac
          (.init secretKey)
          (.update (.getBytes string)))
        .doFinal)))

myproject.hmac-sha256>  (apply str (map #(format "%x" %) (sign "key" "The quick brown fox jumps over the lazy dog")))
"f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"

然后你可以将toString函数编写为:

(defn toHexString [bytes]
  "Convert bytes to a String"
  (apply str (map #(format "%x" %) bytes)))