MD5哈希在objective-c(iOS)中,基于共享密钥

时间:2012-02-11 00:26:44

标签: objective-c ios encryption hash md5

我目前正在开发一款需要将身份验证数据发送到提供的API的应用。基本上,它需要根据您要发送的数据生成基于共享密钥的哈希值。

问题在于,虽然我能够追踪将进行MD5哈希的功能,但它们并非基于密钥,这绝对是至关重要的。

对于iOS平台,有没有办法在objective-c中完成这个?

API通常与PHP一起使用,它提供了类似这个方便的功能:

$key = hash_hmac('md5', $postdata , $sharedkey);

是否有可能在objective-c中实现平等?

2 个答案:

答案 0 :(得分:4)

MD5算法仅使用一个字符串作为输入。惯例是您将密钥(也称为“salt”值)附加到要散列的字符串。我的猜测是,PHP MD5函数有一个第二个参数,用于使生活更轻松,但如果你这样做,你应该得到相同的结果:

NSString *value = [data stringByAppendingString:key];
NSString *hashed = MD5HASH(value); //pseudocode

<强>更新

好的,我检查了Wikipedia,看起来你需要做一些额外的工作来实现HMAC风格的哈希。所以你有两个选择。

  1. 在你已经使用的MD5哈希之上实现HMAC算法(看起来不太难 - 我已经粘贴了下面的伪代码)。

  2. 不要打扰HMAC - 只需通过连接消息和密钥,使用常规MD5在两端生成哈希 - 这应该是非常安全的,这是大多数人所做的。

  3. 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,并获得相同的值。