Я просто изучал реализацию расширения криптографической подписи для экспресс, которое позволяет создавать подписанные файлы cookie.
Mac в функции подписи рассчитывается, как описано здесь:
- создать экземпляр SHA256
- хешировать значение данных
- создать дайджест в кодировке base64
- удалить конечные равные символы ('=')
Результатом является конкатенация исходного значения и рассчитанного 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?