srihash.org 不适用于 cesiumjs.org 中的 .js 文件

Posted

技术标签:

【中文标题】srihash.org 不适用于 cesiumjs.org 中的 .js 文件【英文标题】:srihash.org not working for .js file from cesiumjs.org 【发布时间】:2016-09-28 08:44:16 【问题描述】:

我使用srihash.org 为 URL https://cesiumjs.org/releases/1.21/Build/Cesium/Cesium.js 生成了以下代码:

<script src="https://cesiumjs.org/releases/1.21/Build/Cesium/Cesium.js"
integrity="sha384-CAN0Iz/H09oATWPeJZclEOAM/nF1cq3DSuAbxi9IMbZIx8m3ERInrpuk11n+lHRq"
crossorigin="anonymous"></script>

在尝试加载包含完整性检查脚本的页面时,我在 Windows 上的 Chrome 50 中收到以下错误:

未能在“完整性”属性中找到有效的摘要 资源'https://cesiumjs.org/releases/1.21/Build/Cesium/Cesium.js' 具有计算的 SHA-256 完整性 'vGCl/67DuYY5UzwNQGGpYh2gztA4PhvD+I4pcX7TWcU='。该资源已 被屏蔽了。

我还尝试手动生成哈希(同样,在 Windows 上,openssl-1.0.2h),使用:

openssl dgst -sha384 -binary Cesium.js | openssl base64 -A

导致:

X5EHALkqk8r9hyCKwav7y+6BOUg2dRH90/qSxdytan2SQQB9g8jsYYWLDKzNeKx4

当使用 Chrome 加载 Cesium.js 时,此哈希有效。但是,这提出了两个哈希中哪一个是正确的问题......排除了 MITM 攻击的可能性,我认为它与行尾或编码有关。 Cesium.js 似乎有 Windows 行尾,下面附上在 Chrome 中加载它的 HTTP 响应。

如何解释这两种哈希的区别,哪一种是正确的?


Cesium.js 的 HTTP 响应标头:

HTTP/1.1 200 OK
Cache-Control: max-age=172800
Content-Length: 494091
Content-Type: application/javascript
Content-Encoding: gzip
Last-Modified: Mon, 02 May 2016 15:12:32 GMT
Accept-Ranges: bytes
Server: Microsoft-IIS/8.5
x-amz-id-2: giU2DeYQi87OAkuyr2qKeZx8KRihIY7TV9qcJShi/YVl+C5K50mHeSLFWYhA8k5Oc+A50Oxjh/4=
x-amz-request-id: 112881D9D52248F6
X-Powered-By: ARR/3.0
X-UA-Compatible: IE=edge
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type,X-Requested-With
Date: Mon, 30 May 2016 12:49:46 GMT

【问题讨论】:

【参考方案1】:

正如您所怀疑的,这显然是与编码相关的 chrome 错误。其他人报告其他脚本的问题。

查看this bug page 了解 chrome 和 openssl 之间的不一致。

作为临时解决方法,我会添加

vGCl/67DuYY5UzwNQGGpYh2gztA4PhvD+I4pcX7TWcU=

到您信任的 SHA256 完整性属性(在验证下载的脚本实际上是正确的之后)。

Chrome 可能在解压缩之前使用特殊编码计算此哈希值。

【讨论】:

不,这不是问题所在。正如我在问题中所说,我手动生成的 SHA-384 确实有效。 Chrome 在错误消息中引用 SHA-256 哈希的事实并不意味着它不支持 SHA-384。 很有趣,但我实际上使用的是不受此错误影响的更新版本的 Chrome。此外,正如我所说,Chrome 和 OpenSSL 的行为在我的案例中是一致的。【参考方案2】:

经过一番挖掘,我发现srihash.org生成的hash不正确。

不正确的结果是由两个因素共同造成的:

来自 cesiumjs.org 的Cesium.js 始终使用Content-Encoding: gzip 提供服务,即使请求不包含Accept-Encoding: gzip

srihash.org(参见source)使用xhr2 获取资源,其中does not support gzip encoding。

【讨论】:

以上是关于srihash.org 不适用于 cesiumjs.org 中的 .js 文件的主要内容,如果未能解决你的问题,请参考以下文章

CesiumJS - 3D Tiles BIM

CesiumJS - 3D Tiles BIM

cesium学习--初识

CesiumJS下载量超过1百万次

Cesiumjs初学第一天

cesiumjs