这些工作:
crypto.subtle.digest('SHA-512', new Uint8Array([0]))
crypto.subtle.digest('SHA-512', new Uint8Array([0]).buffer)
这些不是:
crypto.subtle.digest('SHA-512', new Proxy(new Uint8Array([0]),{}))
crypto.subtle.digest('SHA-512', new Proxy(new Uint8Array([0]).buffer,{})
错误:
Failed to execute 'digest' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'
instanceof Uint8Array
和instanceof ArrayBuffer
在两种情况下都返回true。
答案 0 :(得分:2)
digest
is specified by its IDL interface仅接受BufferSource
,either an ArrayBufferView
or an ArrayBuffer
。此IDL级别的输入表明正确的实现将断然拒绝任何没有正确内部类型的输入。
您可能想要使用Proxy
的任何技巧都不能用于digest
。相反,您可以执行代理技巧,在将数据传递到ArrayBuffer
之前立即获得所需的确切digest
。
例如,这里有一个伪造buffer
的代理,它与内部对象的buffer
不同。 buffer
是真实的,因此可以传递到digest
,但它是由Proxy
魔法创建的:
var proxy = new Proxy(new Uint8Array([0]), {
get:function(obj, prop) {
if(prop=="buffer"){ return new Uint8Array([42]).buffer }
else { return obj[prop]; }
}
});
crypto.subtle.digest('SHA-512', proxy.buffer)
如果无法生成缓冲区(例如,如果它太大而无法放入RAM),那么您目前必须依赖SubtleCrypto之外的其他内容。
这似乎是与W3C一起提出的一个很好的观点,例如,支持update
机制来迭代收集输入。