Я работаю с API keybase.io - пытаюсь управлять им из javascript. Вход в систему состоит из двух шагов. Второй шаг подробно описан на странице https://keybase.io/docs/api/1.0/call/login.
Я застрял на следующем;
Сервер и клиент совместно используют этот секрет, и для того, чтобы клиент успешно зарегистрировал пользователя, он должен подтвердить знание этого секрета серверу. Для защиты от повторных атак он не отправляет сам секрет. Скорее, он обрабатывает pwh как ключ MAC, а MAC использует временный сеанс login_session, полученный на предыдущем шаге:
hmac_pwh = HMAC-SHA512(pwh, base64decode(login_session))
Оба входа в двоичном формате; ключ pwh был выведен в двоичном формате из scrypt выше, а login_session декодируется с помощью base64, а затем передается в HMAC в двоичном формате.
Я использую библиотеку CryptoJS, которая дает следующий пример для реализации
var hash = CryptoJS.HmacSHA256('Message','Secret Passphrase');
У меня есть пара проблем;
с точки зрения терминологии, равен ли «MAC-ключ» «секретной фразе-паролю» и, следовательно, параметры функции CryptoJS меняются местами в своем порядке по сравнению с примером кода, приведенным в Keybase?
Пример CryptoJS имеет простые входные данные ascii, в то время как инструкции Keybase предназначены для подачи двоичных входных данных. Когда я пытаюсь передать ему параметр uint8array (это то, что я получаю на предыдущем этапе использования API базы ключей), он падает следующим образом;
TypeError: g.clamp is not a function
e,m=4*h; g.sigBytes>m&&(g=f.finalize(g)); g.clamp(); for(var r=this._oKey=g.clone()