我需要在纯Lua中编写HMAC-MD5算法..
我得到了这个算法from Wikipedia
function hmac (key, message)
if (length(key) > blocksize) then
key = hash(key) // keys longer than blocksize are shortened
end if
if (length(key) < blocksize) then
key = key ∥ [0x00 * (blocksize - length(key))] // keys shorter than blocksize are zero-padded ('∥' is concatenation)
end if
o_key_pad = [0x5c * blocksize] ⊕ key // Where blocksize is that of the underlying hash function
i_key_pad = [0x36 * blocksize] ⊕ key // Where ⊕ is exclusive or (XOR)
return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // Where '∥' is concatenation
end function
我有来自here的md5代码。 md5计算功能正常工作..
在lua中实现算法,到目前为止我有以下代码
local function hmac_md5(key,msg)
local blocksize = 64
if string.len(key) > blocksize then
key = calculateMD5(key)
end
while string.len(key)<blocksize do
key = key .. "0"
end
-- local o_key_pad = bit_xor((0x5c * blocksize),key)
-- local i_key_pad = bit_xor((0x36 * blocksize),key)
return calculateMD5(o_key_pad..calculateMD5(i_key_pad..message))
end
--calculateMD5 is the md5.Calc function in the Stackoverflow link specifed
我被困在计算o_key_pad和i_key_pad的部分..我只是对2个值进行异或吗?维基百科链接中的python实现有一些奇怪的计算.. 请帮忙!
答案 0 :(得分:3)
是,“⊕”是“独家或”的符号。
请记住:一旦计算出最终的哈希值,不要使用普通的字符串比较来检查哈希值是否正确。 WILL 允许攻击者签署任意邮件。
请注意0x5c * blocksize
可能不是您要查找的内容,因为0x5c
乘以blocksize
。您希望在每个位置创建一个长度为blocksize
的数组,其中包含0x5c
。
请注意,您必须填充零字节,而不是字符"0"
。所以key = key .. "0"
是错误的。它应该是key = key .. "\0"
,或者你在Lua中创建NUL字节。