4

这些工作:

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 Uint8Arrayinstanceof ArrayBuffer在两种情况下都返回 true。

4

1 回答 1

2

digest由其 IDL 接口指定仅接受 a BufferSource,即anArrayBufferView或 anArrayBuffer。这种 IDL 级别的类型表示正确的实现将明确拒绝任何不具有正确内部类型的输入。

您可能想使用的任何技巧Proxyfor 根本无法使用digest. 相反,您可以ArrayBuffer在将数据传递到digest.

例如,这里有一个代理,它伪造了一个与其内部对象buffer不同的 a。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迭代收集输入的机制。

于 2017-10-06T15:54:47.090 回答