2015-04-04 2 views
2

Я работаю с API-интерфейсом keybase.io - пытаясь запустить его из javascript. Вход в систему - это двухэтапный процесс. Второй этап подробно описан в https://keybase.io/docs/api/1.0/call/login.Реализация HMAC-SHA256 для Keybase в Javascript

Я застрял на следующем;

Сервер и доля клиента этот секрет, и для клиента успешно зарегистрировать пользователя в, он должен доказать знание этого секрета к серверу. Чтобы защитить от повторных атак, не отправляет сам секрет. Скорее всего, это относится к PWH как ключ MAC и MACs временного login_session найденному на предыдущем шаге:

hmac_pwh = HMAC-SHA512(pwh, base64decode(login_session)) 

Оба входа в двоичном формате; ключ pwh был выведен в двоичном формате из вышеприведенного скриншота, а login_session base64-decoded , а затем отправлен в HMAC в двоичном формате.

Я использую библиотеку CryptoJS, которая дает следующий пример реализации

var hash = CryptoJS.HmacSHA256('Message','Secret Passphrase'); 

У меня есть несколько проблем;

  1. как вопрос терминологии означает «ключ MAC» равный «Секретный Passphrase» и, следовательно, параметры функции CryptoJS перепутаны в порядке их против примера коды, заданного на Keybase?

  2. Пример CryptoJS имеет простые входы ascii, в то время как инструкции на Keybase предназначены для подачи двоичных входов. Когда я пытаюсь передать его параметру uint8array (который я получаю с предыдущего этапа использования API-интерфейса keybase), он кипит следующим образом;

    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() 
    

ответ

2

CryptoJS.HmacSHA256() счастливо берет свое собственное WordArray в качестве ключа. Поэтому вам нужно только преобразовать UInt8Array в CryptoJS 'WordArray.

Это post предоставляет такой (непроверенный) конвертер, созданный Винченцо Ciancia:

CryptoJS.enc.u8array = { 
    /** 
    * Converts a word array to a Uint8Array. 
    * 
    * @param {WordArray} wordArray The word array. 
    * 
    * @return {Uint8Array} The Uint8Array. 
    * 
    * @static 
    * 
    * @example 
    * 
    *  var u8arr = CryptoJS.enc.u8array.stringify(wordArray); 
    */ 
    stringify: function (wordArray) { 
     // Shortcuts 
     var words = wordArray.words; 
     var sigBytes = wordArray.sigBytes; 

     // Convert 
     var u8 = new Uint8Array(sigBytes); 
     for (var i = 0; i < sigBytes; i++) { 
      var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 
      u8[i]=byte; 
     } 

     return u8; 
    }, 

    /** 
    * Converts a Uint8Array to a word array. 
    * 
    * @param {string} u8Str The Uint8Array. 
    * 
    * @return {WordArray} The word array. 
    * 
    * @static 
    * 
    * @example 
    * 
    *  var wordArray = CryptoJS.enc.u8array.parse(u8arr); 
    */ 
    parse: function (u8arr) { 
     // Shortcut 
     var len = u8arr.length; 

     // Convert 
     var words = []; 
     for (var i = 0; i < len; i++) { 
      words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8); 
     } 

     return CryptoJS.lib.WordArray.create(words, len); 
    } 
}; 
Смежные вопросы