Ключ hmac и длина соли

Я использую hmac sha1 для подписи идентификатора пользователя, который передается сторонней службе. Один и тот же секрет используется для всех пользователей, и соль уникальна для каждого пользователя.

token = userid : timestamp+2hours : hmac(userid : timestamp+2hours, salt+secret)
token_hex = hex(hash)

Будет ли hmac работать с короткими строками? userid:timestamp может быть, например, 12:1304985212 Имеет ли значение порядок соли и секрета? (соль + секрет против секрета + соль) Какова должна быть длина общего секрета и длина соли? Могу ли я использовать один и тот же секрет для подписи сообщений между сервером и удаленной службой или лучше создать отдельный секрет?

Спасибо


person pablo    schedule 10.05.2011    source источник


Ответы (1)


Вы должны вычислить hmac(salt:userid:timestamp+2hours, secret) и передать salt:userid:timestamp+2hours: hash. Цель соли здесь состоит в том, чтобы сделать открытый текст более длинным и не повторяющимся, поэтому его лучше добавлять к открытому тексту, а не к секрету.

Если вы действительно хотите изменить секрет, сделайте hmac(userid: timestamp+2hours, hash(salt: secret)), это сделает одноразовый секрет более похожим на случайное число.

person blaze    schedule 10.05.2011
comment
добавление соли к части открытого текста имеет смысл. Имеет ли значение, передам ли я соль или передам ее в автономном режиме между сервером и удаленной службой, как секрет? Есть ли шанс, что секрет может быть взломан? Ваш второй пример защищает от этого, но, возможно, вы имеете в виду: hmac(salt:userid:timestamp, hash(salt:secret)). Мне действительно нужен hmac в этом случае или достаточно иметь sha1(userid:timestamp:salt:secret)? - person pablo; 10.05.2011
comment
Вы не можете передать соль в автономном режиме полезным способом: соль ДОЛЖНА быть случайной и использоваться только один раз, изменяясь с каждым сообщением. Таким образом, вы можете получить его только из генератора случайных чисел перед использованием и передать с данными. В соли нет ничего секретного, пока она каждый раз не меняется. На самом деле, если вы отправляете не более одного сообщения в секунду, вам вообще не нужна отдельная соль: будет достаточно хэша (метки времени). Секрет не может быть извлечен из результата HMAC, ваш единственный риск — украсть его с сервера. Второй пример просто делает HMAC неповторяющимся, предоставляя каждый раз новый секрет, а не новый открытый текст. - person blaze; 11.05.2011
comment
что не так с использованием только временной метки вместо хэша (временной метки) в качестве соли и usersecret + globalsecret для предотвращения радужной атаки? - person pablo; 11.05.2011
comment
Если вы будете использовать отдельную соль – ничего страшного. Hash(timestamp) предназначен только для использования в качестве соли: может быть неплохо распределить 1-битную разницу в последовательности временных меток по длинному результату хеширования. - person blaze; 12.05.2011
comment
Я не понимаю вашего последнего комментария. метка времени, как соль хорошо или плохо? hash(timestamp) как соль лучше? - person pablo; 13.05.2011
comment
Временная метка в качестве соли допустима, если 1) нет двух сообщений с одинаковым идентификатором пользователя и временной меткой; 2) вы используете хеш (временную метку) в качестве соли. - person blaze; 13.05.2011