Вопрос
Думаю, в прошлый раз я был недостаточно конкретен.Вот так:
У меня есть шестнадцатеричная строка:
742713478FB3C36E014D004100440041004 E0041004E00000060F347D15798C9010060 6B899C5A98C9014D007900470072006F007 500700002F001467900470072006F007 500700002F001467900470072006F007 500700002F00146790047007006F007 7CA52090D35B50060606060606
Последние 20 байт должны (теоретически) содержать SHA1-хэш первой части (полная строка — 20 байт).Но мне это не подходит.
Пытался сделать это с помощью PHP, но безуспешно.Можете ли вы получить спичку?
Билет:
742713478FB3C36E014D004100 440041004E0041004E00000060 F347D15798C90100606B899C5A 98C9014D007900470072006F00 750070000000000001F76900470072006F00 750070000000000001F76790047007006F00 75007000000000000100790047007006F00 7500700000000001790047007006F00
Хэш sha1 билета добавлен к оригиналу:
3306295fb5f1f57ca52090d35b50060606060606
Мой sha1-хеш билета:
b6ecd613698ac3533b5f853bf22f6eb4afb94239
Вот что находится в билете и как он хранится.Кстати, я могу получить имя пользователя и т. д. и определить различные разделители.http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals/AuthTicket2.JPG
Отредактировано:Я обнаружил, что строка дополняется в конце функцией дешифрования, которую она проходит до этого момента.Я удалил последние 6 байтов и соответствующим образом скорректировал их по билету и хешу.Все еще не работает, но я ближе.
Решение
Ваш билет рассчитывается на основе самой шестнадцатеричной строки.Может быть, добавленный хеш рассчитывается на основе другого представления тех же данных?
Другие советы
Я думаю, вы путаетесь в байтах и символах.
Внутренне php хранит каждый символ строки как байт.Хэш sha1, который генерирует PHP, представляет собой 40-символьное (40-байтовое) шестнадцатеричное представление 20-байтовых двоичных данных, поскольку каждое двоичное значение должно быть представлено двумя шестнадцатеричными символами.
Я не уверен, что это настоящий источник вашего несоответствия, но, видя это недоразумение, я задаюсь вопросом, связано ли это с этим.
Попробуйте сначала обрезать строку: на удивление легко иметь в конце новую строку или пробел, который полностью меняет хэш.
Согласно этому Онлайн-инструмент SHA1 хэш данного текста (после удаления новых строк и пробелов) равен
b6ecd613698ac3533b5f853bf22f6eb4afb94239
Идея:Убедитесь, что вводимые символы не являются шестнадцатеричным числом версии PHP.
Проблема заключалась в том, что оригинал представлял собой хэш с ключом.Мне пришлось использовать hash_hmac() с ключом проверки, а не sha1() без него.