我目前正在为WebAuthN(FIDO U2F、FIDO2)集成编写一个概念验证 Web 应用程序。
返回字段的数据类型cred.rawId
为ArrayBuffer
。在 Chromes 的开发者控制台中,该字段如下所示:
当我尝试重现这个 ArrayBuffer 时,我得到了这样的结果:
注意“其他表示”(例如[[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 屏幕截图中显示的表示?