Как создать SHA256 HMAC с помощью Ironclad в Common Lisp?

есть функция python, которую я пытаюсь перенести в Common Lisp:

HEX(HMAC_SHA256(apiSecret, 'stupidstupid'))

как я могу сделать это с Ironclad?

ближе всего я подошел:

(ironclad:make-hmac apiSecret :sha256)

, но он не работает; он говорит, что apiSecret

The value "V0mn1LLQIc6GNSiBpDfDmRo3Ji8leBZWqMIolNBsnaklScgI"
is not of type
  (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (*)).

1 ответов


Ironclad внутренне работает с массивами байтов.

но он предоставляет инструменты для преобразования из строк ascii в такие массивы и из байтов в "шестнадцатеричные" строки. Вот интерактивный сеанс (обратите внимание, что я мало знаю о криптографических алгоритмах):

CL-USER> (in-package :ironclad)
#<PACKAGE "IRONCLAD">

преобразование секрет:

CRYPTO> (ascii-string-to-byte-array "V0mn1LLQIc6GNSiBpDfDmRo3Ji8leBZWqMIolNBsnaklScgI")
#(86 48 109 110 49 76 76 81 73 99 54 71 78 83 105 66 112 68 102 68 109 82 111
  51 74 105 56 108 101 66 90 87 113 77 73 111 108 78 66 115 110 97 107 108 83
  99 103 73)

построение HMAC из предыдущего значения:

CRYPTO> (make-hmac * :sha256)
#<HMAC(SHA256) {1006214D93}>

теперь, я не уверен, что это то, что вы хотите, но, по словам в документация, вы должны обновить hmac с одной или несколькими последовательностями:

CRYPTO> (update-hmac * (ascii-string-to-byte-array "stupidstupid"))
#<HMAC(SHA256) {1006214D93}>

... а затем вычислить дайджест:

CRYPTO> (hmac-digest *)
#(178 90 228 244 244 45 109 163 51 222 77 235 244 173 249 208 144 43 116 130
  210 188 62 247 145 153 100 198 119 86 207 163)

полученный массив можно преобразовать в шестнадцатеричную строку:

CRYPTO> (byte-array-to-hex-string *)
"b25ae4f4f42d6da333de4debf4adf9d0902b7482d2bc3ef7919964c67756cfa3"

для полноты, вот как вы могли бы обернуть эти функции для репликации исходного кода, предполагая, что вы находитесь в пакете, который импортирует правильные символы:

(defun hex (bytes)
  (byte-array-to-hex-string bytes))

(defun hmac_sha256 (secret text)
  (let ((hmac (make-hmac (ascii-string-to-byte-array secret) :sha256)))
    (update-hmac hmac (ascii-string-to-byte-array text))
    (hmac-digest hmac)))

и наконец:

(HEX (HMAC_SHA256 "V0mn1LLQIc6GNSiBpDfDmRo3Ji8leBZWqMIolNBsnaklScgI"
                  "stupidstupid"))

=> "b25ae4f4f42d6da333de4debf4adf9d0902b7482d2bc3ef7919964c67756cfa3"