我目前正在开发一款需要将身份验证数据发送到提供的API的应用。基本上,它需要根据您要发送的数据生成基于共享密钥的哈希值。
问题在于,虽然我能够追踪将进行MD5哈希的功能,但它们并非基于密钥,这绝对是至关重要的。
对于iOS平台,有没有办法在objective-c中完成这个?
API通常与PHP一起使用,它提供了类似这个方便的功能:
$key = hash_hmac('md5', $postdata , $sharedkey);
是否有可能在objective-c中实现平等?
答案 0 :(得分:4)
MD5算法仅使用一个字符串作为输入。惯例是您将密钥(也称为“salt”值)附加到要散列的字符串。我的猜测是,PHP MD5函数有一个第二个参数,用于使生活更轻松,但如果你这样做,你应该得到相同的结果:
NSString *value = [data stringByAppendingString:key];
NSString *hashed = MD5HASH(value); //pseudocode
<强>更新强>
好的,我检查了Wikipedia,看起来你需要做一些额外的工作来实现HMAC风格的哈希。所以你有两个选择。
在你已经使用的MD5哈希之上实现HMAC算法(看起来不太难 - 我已经粘贴了下面的伪代码)。
不要打扰HMAC - 只需通过连接消息和密钥,使用常规MD5在两端生成哈希 - 这应该是非常安全的,这是大多数人所做的。
HMAC算法
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
答案 1 :(得分:1)
通常,您只需将密钥附加到要散列的字节。
因此,如果共享密钥是“12345”并且您正在传递username = jsd和password = test,那么您将构建类似“username = jsd&amp; password = test&amp; secret = 12345”的字符串。然后接收端将从用户名&amp ;;构建自己的版本。密码+密码,运行相同的md5,并获得相同的值。