Как создать JavaScript ArrayBuffer, который похож на ArrayBuffer WebAuthN?

В настоящее время я пишу концептуальное веб-приложение для интеграции WebAuthN (FIDO U2F, FIDO2).

Тип данных возвращаемого поля cred.rawId является ArrayBuffer, В консоли разработчика Chromes это поле показано здесь:

Представление консоли разработчика Chromes на исходных данных cred.rawId

Когда я пытаюсь воспроизвести этот ArrayBuffer, я получаю следующее:

Взгляд консоли разработчика Chromes на собственную реализацию rawId

Обратите внимание на "другие представления" (например, [[Int8Array]]), которые все обнулены! Кроме того, мой ArrayBuffer выглядит как обычный массив, в то время как данные не отображаются (таким образом) на первом оригинальном скриншоте.

Это исходный код (помните: состояние PoC) для получения rawId из сохраненного представления Base64:

function StringToByteArray(str) {
  var bytes = new ArrayBuffer();
  for (var i = 0; i < str.length; ++i) {
    var code = str.charCodeAt(i);
    var _bytes = new ArrayBuffer(bytes.byteLength + 1);
    for ( var j = 0; j < bytes.byteLength; j++ ) {
      _bytes[j] = bytes[j];
    }
    _bytes[bytes.byteLength] = code;
    bytes = _bytes
  }
  return bytes;
}

var x_rawId = StringToByteArray(base64.decode(cred.id.replace(/-/g, '+').replace(/_/g, '/').padRight(cred.id.length + (4 - cred.id.length % 4) % 4, '=')));

Класс Base64 взят из Base64 для реализации JavaScript Ника Гэлбрейнесса.

Электрический ток rawId может работать, однако я хотел бы воспроизвести его на 100%, чтобы минимизировать вероятность сбоя в другом браузере в какой-либо будущей версии браузера.

Как добиться представления, которое показано на скриншоте Chrome?

0 ответов

Не могли бы вы попробовать заменить функцию следующим:

function StringToByteArray(str) {
  return Uint8Array.from(str, c => c.charCodeAt(0));
}

Это очень просто, но это помогает мне в одном из моих проектов.

Другие вопросы по тегам