今天在 JavaScript 浏览器环境概述 中看到以下描述,因此特意去了解了什么是hash.
为了防止攻击者篡改外部脚本,
script
标签允许设置一个integrity
属性,写入该外部脚本的Hash签名,用来验证脚本的一致性。
<script src="/assets/application.js"
integrity="sha256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs=">
</script>
上面代码中,
script
标签有一个integrity
属性,指定了外部脚本/assets/application.js
的SHA265签名。一旦有人改了这个脚本,导致SHA265签名不匹配,浏览器就会拒绝加载。
笔记:
通俗来说,hash算法会把一段内容经过计算后转化为一串固定长度的值,特点是不同内容 a 和 b 转化得到的 hash 值相同的概率非常小,因此这段 hash 值可以看做是 a 或者 b 的指纹。
如上文提到的SHA265转换:
‘test1’ 转换值 ‘1B4F0E9851971998E732078544C96B36C3D01CEDF7CAA332359D6F1D83567014’;
‘test2’ 转换值 ‘60303AE22B998861BCE3B28F33EEC1BE758A213C86C93C076DBE9F558C11C752’;
即使只变了一个数字,得到的hash值差别也是很大的。