如何在Common Lisp中使用Ironclad创建SHA256 HMAC?

问题描述:

有一个Python函数我想移植到Common Lisp的:如何在Common Lisp中使用Ironclad创建SHA256 HMAC?

HEX(HMAC_SHA256(apiSecret, 'stupidstupid')) 

我如何去了解这个有铁甲?

我来最接近的是:

(ironclad:make-hmac apiSecret :sha256) 

但它不工作;它说apiSecret

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

将其转换为数组? –

+0

我将如何将字符串转换为简单数组? – pebblexe

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}> 

现在,我不确定这是你想要的,但根据the documentation,你应该更新一个或多个序列的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" 
+2

谢谢!这是一个详细而全面的答案,我很欣赏你写这篇文章的时间。 – pebblexe