2

我目前正在为WebAuthN(FIDO U2F、FIDO2)集成编写一个概念验证 Web 应用程序。

返回字段的数据类型cred.rawIdArrayBuffer。在 Chromes 的开发者控制台中,该字段如下所示:

Chromes 对原始 cred.rawId 数据的开发者控制台视图

当我尝试重现这个 ArrayBuffer 时,我得到了这样的结果:

Chromes 开发者控制台查看自己的 rawId 实现

注意“其他表示”(例如[[Int8Array]]),它们都被清零了!此外,我的 ArrayBuffer 看起来像一个普通数组,而在第一个原始屏幕截图中(以这种方式)未显示数据。

这是rawId从存储的 Base64 表示中检索的源代码(记住:PoC 状态):

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 类来自Nick Galbreaths 的 Base64 for JavaScript implementation

当前rawId可能有效,但是我想 100% 重现它,以便在将来的某个浏览器版本中将它在其他浏览器中失败的可能性降到最低。

如何实现 Chrome 屏幕截图中显示的表示?

4

1 回答 1

1

您能否尝试用以下内容替换该功能:

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

这很简单,但它在我的一个项目中起到了作用。

于 2019-05-29T11:42:37.340 回答