Хеширование MD5 в target-c (iOS) на основе общего ключа - PullRequest
1 голос
/ 11 февраля 2012

В настоящее время я разрабатываю приложение, которое должно отправлять данные аутентификации вместе с предоставленным API.По сути, он должен генерировать хеш на основе данных, которые вы хотите отправить, на основе общего ключа.

Проблема в том, что, хотя мне удалось отследить функции, которые будут выполнять хеширование MD5, они неоснованный на ключе, который абсолютно важен.

Есть ли способ сделать это в target-c для платформы iOS?

API обычно используется с PHP, который предоставляет что-токак эта удобная функция:

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

Есть ли какой-нибудь шанс реализовать эквивалент в target-c?

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

Алгоритм MD5 использует только одну строку в качестве входных данных. Соглашение состоит в том, что вы добавляете свой ключ (он же «соль») к строке, которую вы хэшируете. Я предполагаю, что функция PHP MD5 имеет второй параметр для ключа, чтобы облегчить жизнь, но вы должны получить тот же результат, если просто сделаете это:

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

UPDATE:

Хорошо, я проверил Википедию и похоже, что вам нужно проделать дополнительную работу для реализации хеширования в стиле HMAC. Таким образом, у вас есть два варианта.

  1. Реализация алгоритма HMAC поверх уже используемого хеша MD5 (он не выглядит слишком сложным - я вставил псевдокод ниже).

  2. Не беспокойтесь о 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 голос
/ 11 февраля 2012

Обычно вы просто добавляете ключ к байту, который хэшируете.

Таким образом, если общий секретный ключ равен «12345», и вы передаете username = jsd и password = test, вы должны создать свою строку как «username = jsd & password = test & secret = 12345». Тогда принимающая сторона создаст свою собственную версию из имени пользователя и пароля + секрета, запустит тот же md5 и получит то же значение.

...