php hmac sha1 base64

PHP Generate HMAC-SHA1 signature

This is driving me crazy.

I am trying to generate a signature as suggested here: https://www.reed.co.uk/developers/SignatureTest

Now for some reasons it returns this on my server: WRTjqQKfyEQyLJEzWWuT3SWgGPk= While the expected result is: JUgvCh5oeFYe1HDmfiMObOu1+nQ=

I tried everything, even swapping from little endian to big endian. Nothing.

2 Answers 2

I struggled with the same issue; the solution is posted here under a different question.

The issue is that the string key (GUID) needs its order of the 2-character hexadecimal numbers reversed in the first 3 segments (http://msdn.microsoft.com/en-us/library/system.guid.tobytearray.aspx).

Example to create the hash (using your key above):

This produces a hash that matches that from the Signature Test.

php hmac sha1 base64. Смотреть фото php hmac sha1 base64. Смотреть картинку php hmac sha1 base64. Картинка про php hmac sha1 base64. Фото php hmac sha1 base64

for sha1 only need the hash_hmac function

php hmac sha1 base64. Смотреть фото php hmac sha1 base64. Смотреть картинку php hmac sha1 base64. Картинка про php hmac sha1 base64. Фото php hmac sha1 base64

Not the answer you’re looking for? Browse other questions tagged php hmacsha1 or ask your own question.

Linked

Related

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.17.40238

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Trouble creating auth string using PHP HMAC SHA1 and Base64

So I am working with this API and using Laravel, and I am trying to build an auth string. This is the documentation I was given, but I am having a little trouble as this is something relatively new to me.

Here are the auth instructions:

The authentication parameter is a string and it can calculated by the caller or the caller can choose to save this value as a parameter together with connection ID and API key.

The authentication is a base64 string of a HMAC SHA1 hash. This is computed by using the binary of API Key in in

########################## format in all lower case and UTF8 encoding as the key and computer HMAC SHA1 hash on the binary of

Connection ID in ################################ format in all lower case and UTF8 encoding.

The result binary hash is then base64 encoded and the text result is what should be passed as the authentication parameter. In C# the code to calculate the authentication may look like:

As an example the following credentials:

Connection ID: 5fecbc200f0e4a7cbf41040e11047e56

API Key: 2de51c4fd0f04b9fabeb95225e87da70

Should result in a computed authentication value of m5/Vc1RzhUETQvEtx/JdIglQpTg=

So what i have been trying is:

Which outputs QjG3kzUs7U1UukNd++3t24pBWNk=

I have tried a few more variations, but I am just lost on this one. First time really decoding or encoding anything. Would greatly appreciate any tips, ideas, or snippets that can help me figure this out. Already spent a few hours on this and it’s bugging me..

1 Answer 1

First: Get rid of utf8_encode() and just generally don’t use it. It assumes that the input string is ISO-88591-1 and if it is anything else it will silently corrupt the data. This function has an incredibly misleading name, and I would go as far as to suggest that no one should ever use it or the corresponding utf8_decode() which will break your data in the same manner, but reversed.

Second: Whatever you think decbin() does, you’re incorrect. It converts an integer into a literal, capital-S String composed of 0 and 1 characters.

Third: PHP strings have no inherent encoding and are roughly equivalent to byte arrays if you twisted my arm for a description. The bytes you put into them are the bytes you get out of them.

Start simple, use meaningful variable names, build up, and read the docs.

Источник

Подписываем данные: HMAC на практике в API и Web-формах

HMAC (сокращение от англ. hash-based message authentication code, код проверки подлинности сообщений, использующий односторонние хеш-функции) — в криптографии, один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами (атака типа «man in the middle»).

К таким данным могут относиться например данные, передаваемые в запросах API, когда критически важна целостность передаваемой информации, или же при передаче данных из Web-форм.

Зачем это нужно?

Если отойти от научной формулировки, что же такое подпись данных и как это реализуется на практике?

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

Например, мы имеем исходный массив данных вида:

Самое простое, что мы можем сделать – это каким-то образом сериализовать массив (привести его в строковое представление), добавить в конец получившейся строки некий секретный ключ – набор символов известный только нам и получателю данных (пусть будет “mysecretkey”), после чего применить к этому какую-нибудь хеш-функцию, скажем, md5.

Какие можно встретить практические решения? В зависимости от того, важны ли значения массива или его ключи, можно встретить, например, такие реализации:

Какие есть плюсы и недостатки у данных реализаций?

Самый первый и очевидный плюс, но он же и единственный – это простота реализации. Минусы? Их масса, как минимум в качестве ключевых недостатков, можно привести:

В частности, таким образом, можно формировать более продвинутые CSRF-токены для форм, используя в качестве секретного ключа какой-нибудь внутренний идентификатор, привязанный к сессии пользователя. Тем самым мы решим сразу две задачи – и защиту от CSRF и контроль целостности набора передаваемых параметров – пользователь уже не сможет «поиграться» с полями формы и попробовать добавить или убрать что-нибудь из параметров.

Остальные три пункта требуют решения. С первым все достаточно просто – используем более современные и стойки хеш-аглоритмы с большей длиной шифрограммы, такие, как SHA256 или SHA512 и спим спокойно.

Второй пункт – тоже решается, если определиться, что элементы массива будут отсортированы по какому-то принципу, скажем, в алфавитном порядке.

Добавлеям перед сериализацией массива:

в результате чего, получаем массив, отсортированный по ключам в алфавитном порядке, и нам становится не важно, в какой последовательности были переданы переменные в массиве.

Следующая проблема решается уже не так просто. Пока мы работали с плоскими массивами все было достаточно просто – отсортировали, в строчку сложили с каким-нибудь разделителем типа ”;” – и готово. Но как же быть с вложенными (многомерными) массивами?

Во-первых функция ksort не рекурсивная, но это, конечно же не большая проблема и решение было найдено достаточно быстро:

Во-вторых, массив с вложенностями линейно в строчку уже не сложишь – нужно придумывать дополнительные правила (то есть, изобретать велосипед), или использовать уже «настоящую» сериализацию, такую как JSON, который учитывал бы все вложенные структуры. Использование JSON также решает и четвертую проблему, так как мы сериализуем сразу весь массив, не ограничиваясь отдельно его ключами или значениями.

Почему именно JSON а не простой serialize PHP? Выбор в пользу JSON упал не случайно, поскольку это очень популярный формат сериализации, с которым будет легко работать не только в PHP, но и в любых других популярных языках программирования, таких как Java. Наша реализация должна быть предельно легко переносима на другие платформы и с использованием JSON-сериализации это будет сделать проще всего.

В этом случае все перечисленные проблемы решаются, но встает вопрос с секретным ключом – делать простую конкатенацию ключа справа конечно можно, но это не очень эстетично, благо в PHP есть реализация HMAC с выбором произвольной хэш-фукции:

HMAC реализует дополнительное XOR данных с ключом и оборачивает сверху указанной хеш-функцией. Сам алгоритм внутри HMAC подробно описан в литературе по криптографии, или в википедии и описывать здесь, каким именно образом происходит шифрование данных на ключе мы не будем. Просто будем пользоваться этим стандартным аглоритмом.

Сводя все изложенное вместе, разработаем простой класс, который реализовывал бы все описанные действия для получения подписи с многомерного массива, вне зависимости от того, в какой последовательности находятся ключи внутри массива.

Итак, получился следующий незамысловатый код:

Для создания подписи предусмотрен метод:

С ним все довольно просто – обязательный аргумент это данные, можно также использовать для формирования подписи другой секретный ключ, передав его вторым параметром.

Для проверки ранее созданной подписи мы реализовали метод

Метод принимает аргументы:

В остальном логика очень проста – собираем подпись, сравниваем регистронезависимо полученную подпись с подписью, переданной в данных.

Метод set_hash_algo, позволяет поменять алгоритм хеш-функции после создания экземпляра объекта. Функция рекурсивной сортировки массива реализована в качестве статического метода, чтобы ее можно было использовать вне экземпляра объекта где-то еще.

Примеры

Проиллюстрируем работу класса на простом примере:

Вместо заключения

Мы получили простую реализацию, позволяющую нам подписывать любые данные и проверять переданные подписанные данные. Теперь вы можете подписывать данные, передаваемые через HTTP/REST API, или же создавать продвинутые CSRF-токены для форм и быть уверенными в том, что получаемые данные оригинальны и консистентны.

Источник

Php hmac sha1 base64

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

sha1 — Возвращает SHA1-хеш строки

Не рекомендуется использовать эту функцию для обеспечения безопасности хранения паролей ввиду высокой скорости работы данного алгоритма. Более подробно читайте в разделе Ответы на часто задаваемые вопросы по хешированию паролей.

Описание

Список параметров

Возвращаемые значения

Возвращает SHA1-хеш в виде строки.

Примеры

Пример #1 Пример использования sha1()

Смотрите также

User Contributed Notes 33 notes

The suggestion below to double-hash your password is not a good idea. You are much much better off adding a variable salt to passwords before hashing (such as the username or other field that is dissimilar for every account).

sha1(md5($pass)) makes even less sense, since you’re feeding in 128-bits of information to generate a 256-bit hash, so 50% of the resulting data is redundant. You have not increased security at all.

To achieve raw binary format prior to PHP5, you can do this.

$raw = pack(«H*», sha1($str));

Here’s a better version of the getDigestNotation() function I posted earlier. (The first version had a bug in the argument checking.)

Keep in mind that MD5 is less secure than SHA1.
Older CPUs can calculate MD5 over twice as fast as SHA1. GPUs in parallel calculations can handle MD5 over 3 times as fast as SHA1!

Two Radeon 79xx-series GPUs can calculate a rainbow table for 6-character lowercase MD5 password in. roughly 6 seconds!

to check a password run pw_check with the password attempt and the stored value, it’ll return true on a match and false otherwise

these functions eliminate the pesky problem of dictionary matches being run on your password lists

Note that the sha1 algorithm has been compromised and is no longer being used by government agencies.

As of PHP 5.1.2 a new set of hashing functions are available.

The new function hash() supports a new range of hashing methods.

echo hash(‘sha256’, ‘The quick brown fox jumped over the lazy dog.’);

It is recommended that developers start to future proof their applications by using the stronger sha-2, hashing methods such as sha256, sha384, sha512 or better.

As of PHP 5.1.2 hash_algos() returns an array of system specific or registered hashing algorithms methods that are available to PHP.

Problems:
1. In most solutions with hash and salt, you were bound to have one extra row in your database that would state, preferably random, salt for that hashed data. If attacker would manage to get drop of your database he would get hashed data and salt that is used with plain data to make it obscure, and then cracking that hashed data would be same as if you didn’t add any salt to it.
2. I stumbled upon some functions that would hash data, then input salt into random places in hash and store it in database, but they would still have to write down random parameter used to scramble salt so they could reuse it when validating data. Getting simple database drop wouldn’t help much here, but if they would manage to get their hands on obscuring function too, they could easily see what is salt and what hash.

Источник

hash_hmac

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_hmac — Генерация хеш-кода на основе ключа, используя метод HMAC

Описание

Список параметров

Имя выбранного алгоритма хеширования (например, «md5», «sha256», «haval160,4» и т.д.) Смотрите hash_hmac_algos() для получения списка поддерживаемых алгоритмов.

Сообщение для хеширования.

Общий секретный ключ, используемый для генерации HMAC хеш-кода.

Возвращаемые значения

Список изменений

ВерсияОписание
7.2.0Запрещено использование некриптографических хеш-функций (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat).

Примеры

Пример #1 Пример использования hash_hmac()

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 17 notes

As Michael uggests we should take care not to compare the hash using == (or ===). Since PHP version 5.6 we can now use hash_equals().

So the example will be:

Please be careful when comparing hashes. In certain cases, information can be leaked by using a timing attack. It takes advantage of the == operator only comparing until it finds a difference in the two strings. To prevent it, you have two options.

For signing an Amazon AWS query, base64-encode the binary value:

A function implementing the algorithm outlined in RFC 6238 (http://tools.ietf.org/html/rfc6238)

Sometimes a hosting provider doesn’t provide access to the Hash extension. Here is a clone of the hash_hmac function you can use in the event you need an HMAC generator and Hash is not available. It’s only usable with MD5 and SHA1 encryption algorithms, but its output is identical to the official hash_hmac function (so far at least).

Here is an efficient PBDKF2 implementation:

Function for those, who really need to use crc32 algorithm in PHP>7.1

Simple implementation of hmac sha1

// Outter and Inner pad
$opad = str_repeat ( chr ( 0x5C ), 64 );
$ipad = str_repeat ( chr ( 0x36 ), 64 );

The Implementation of the PBKDF2 key derivation function as described in RFC 2898 can be used to not only get the hashed KEY but also a specific IV.

To use, one would use it as follows:-

For signing an Amazon AWS query, base64-encode the binary value:

The problem occured because the order of bytes for Tiger
was changed to big endian since PHP 5.4.0.

/* With PHP 5.4 output would be
590546d9f425188da35e5dfa53306ba3953571cc
bd6664330ed96b9b39ee063241b62e43f546a49d

With PHP 5.3
bd6664330ed96b9b39ee063241b62e43f546a49d
590546d9f425188da35e5dfa53306ba3953571cc

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *