Почему куки-подпись в nodejs/express сравнивает подписи, используя хеширование sha1?

Я просто изучал реализацию расширения криптографической подписи для экспресс, которое позволяет создавать подписанные файлы cookie.

Mac в функции подписи рассчитывается, как описано здесь:

  1. создать экземпляр SHA256
  2. хешировать значение данных
  3. создать дайджест в кодировке base64
  4. удалить конечные равные символы ('=')

Результатом является конкатенация исходного значения и рассчитанного mac.

При проверке подписи значение снова подписывается. Но тогда на равенство проверяются не подписи, а сравниваются общие строки, состоящие из исходного значения и добавленного mac:

return sha1(mac) == sha1(val) ? str : false;

Здесь «mac» содержит исходное значение, объединенное со свежевычисленным mac, «val» содержит входную строку, переданную методу проверки (состоящую из исходного значения, объединенного с прежним mac), а «str» — это само значение со знаком.

См.: https://github.com/tj/node-cookie-signature/blob/master/index.js

Я ожидал, что сравнивать будут только маки. Но это не так. Почему авторы выбрали именно такой способ осуществления проверки? Что является причиной этого? И особенно: почему они сравнивают не char с char, а хэш sha1?


person Regis May    schedule 30.10.2015    source источник


Ответы (1)


Функция реализации sign возвращает значение, соединенное с '.' и HMAC. значения, преобразованного в Base64, без завершающего знака «=» (если он есть).

Функция unsign реализации делает то же самое с частью value заданного ввода (до '.') и проверяет, соответствует ли ввод полностью выходу функции sign.

А что касается сравнения с использованием хеш-значений, то авторы пытались отразить атаку по времени, посредством чего злоумышленник будет наблюдать время, необходимое для проверки на равенство символ за символом, и определять по минутным изменениям между двумя попытками, на каком символе проверка не удалась, а затем пытаться угадать посимвольно значение MAC для произвольного значения часть. При сравнении с использованием sha1 дайджеста код занимает постоянное время, зависящее только от заданной полной входной длины.

Более интересным примечанием является удаление заполнения '=' из MAC-адресов, закодированных в Base64, я понятия не имею, зачем им это делать, поскольку есть безопасный вариант URL Base64.

person Zoran Regvart    schedule 31.10.2015
comment
Что объясняет его. Это важная деталь, о которой я не подумал. Большое спасибо за ваш ответ! - person Regis May; 02.11.2015
comment
По этой причине они решили сравнивать хэши, но почему вместо этого они не выбрали сравнение подписей за постоянное время, что было бы намного быстрее, чем генерация двух хэшей SHA1, а также значительно усложнило бы атаки на день рождения, потому что хэши SHA1 равны 160. бит, в то время как подписи SHA256 имеют длину 256 бит (оба являются криптографически случайными)? - person Joe Lapp; 25.06.2016