Как правильно переписать этот хеш-код Python в Javascript браузера? ⇐ Python
Как правильно переписать этот хеш-код Python в Javascript браузера?
Чтобы отправлять запросы к API, мне нужно добавить заголовок со специальной хешированной строкой. Он использует соль с SHA256.
У меня был такой код Python, который работает хорошо:
API_VERSION = 4 ПОДДОМЕН = 'api' ДОМЕН = 'example.com' PARTNER_KEY = '550c04bf5cb2b' HMAC_SECRET = b'd84e9e5f191ea4ffc39c22d11c77dd6c' Защиту create_auth_header (путь, метод): дата = datetime.datetime.now().isoformat() string_to_hash = f'{PARTNER_KEY}\n{дата}\n{метод}\n{СУБДОМЕН}.{ДОМЕН}\n/v{API_VERSION}/{путь}\n' подпись = hmac.new(HMAC_SECRET, msg=string_to_hash.encode('utf-8'), дайджестмод=hashlib.sha256).hexdigest() auth = f"PartnerKey={PARTNER_KEY}, Signature={signature}, Timestamp={date}" возврат авторизации Я хочу то же самое в Javascript.
После некоторого поиска я нашел следующий код с использованием crypto-JS (из https://cdnjs.cloudflare.com/ajax/libs/ ... /crypto-js. min.js):
const API_VERSION = 4; const ПОДДОМЕН = 'api'; const ДОМЕН = 'example.com'; const PARTNER_KEY = '550c04bf5cb2b'; const HMAC_SECRET = 'd84e9e5f191ea4ffc39c22d11c77dd6c'; функция create_auth_header (путь, метод) { константная дата = новая дата().toISOString(); const string_to_hash = `${PARTNER_KEY}\n${date}\n${method}\n${SUBDOMAIN}.${DOMAIN}\n/v${API_VERSION}/${path}\n`; константный кодировщик = новый TextEncoder(); константные данные = encoder.encode(string_to_hash); константный ключ = encoder.encode(HMAC_SECRET); return crypto.subtle.importKey('raw', key, {name: 'HMAC', хэш: 'SHA-256'}, true, ['sign']) .then((cryptoKey) => { return crypto.subtle.sign('HMAC', cryptoKey, data); }) .then((подпись) => { const SignatureHex = Array.from(new Uint8Array(signature)).map((byte) => { return ('0' + byte.toString(16)).slice(-2); }).присоединиться(''); вернуть подписьHex; }) .catch((ошибка) => { console.error('Ошибка:', ошибка); }); } Однако два кода дадут разные результаты для одной и той же даты, и я не знаю, почему.
Чтобы отправлять запросы к API, мне нужно добавить заголовок со специальной хешированной строкой. Он использует соль с SHA256.
У меня был такой код Python, который работает хорошо:
API_VERSION = 4 ПОДДОМЕН = 'api' ДОМЕН = 'example.com' PARTNER_KEY = '550c04bf5cb2b' HMAC_SECRET = b'd84e9e5f191ea4ffc39c22d11c77dd6c' Защиту create_auth_header (путь, метод): дата = datetime.datetime.now().isoformat() string_to_hash = f'{PARTNER_KEY}\n{дата}\n{метод}\n{СУБДОМЕН}.{ДОМЕН}\n/v{API_VERSION}/{путь}\n' подпись = hmac.new(HMAC_SECRET, msg=string_to_hash.encode('utf-8'), дайджестмод=hashlib.sha256).hexdigest() auth = f"PartnerKey={PARTNER_KEY}, Signature={signature}, Timestamp={date}" возврат авторизации Я хочу то же самое в Javascript.
После некоторого поиска я нашел следующий код с использованием crypto-JS (из https://cdnjs.cloudflare.com/ajax/libs/ ... /crypto-js. min.js):
const API_VERSION = 4; const ПОДДОМЕН = 'api'; const ДОМЕН = 'example.com'; const PARTNER_KEY = '550c04bf5cb2b'; const HMAC_SECRET = 'd84e9e5f191ea4ffc39c22d11c77dd6c'; функция create_auth_header (путь, метод) { константная дата = новая дата().toISOString(); const string_to_hash = `${PARTNER_KEY}\n${date}\n${method}\n${SUBDOMAIN}.${DOMAIN}\n/v${API_VERSION}/${path}\n`; константный кодировщик = новый TextEncoder(); константные данные = encoder.encode(string_to_hash); константный ключ = encoder.encode(HMAC_SECRET); return crypto.subtle.importKey('raw', key, {name: 'HMAC', хэш: 'SHA-256'}, true, ['sign']) .then((cryptoKey) => { return crypto.subtle.sign('HMAC', cryptoKey, data); }) .then((подпись) => { const SignatureHex = Array.from(new Uint8Array(signature)).map((byte) => { return ('0' + byte.toString(16)).slice(-2); }).присоединиться(''); вернуть подписьHex; }) .catch((ошибка) => { console.error('Ошибка:', ошибка); }); } Однако два кода дадут разные результаты для одной и той же даты, и я не знаю, почему.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение