javascript七基础学习系列一千零九十一:使用SubtleCrypto 对象

Web Cryptography API 重头特性都暴露在了SubtleCrypto 对象上,可以通过window.crypto.
subtle 访问:
console.log(crypto.subtle); // SubtleCrypto {}
这个对象包含一组方法,用于执行常见的密码学功能,如加密、散列、签名和生成密钥。因为所有
密码学操作都在原始二进制数据上执行,所以SubtleCrypto 的每个方法都要用到ArrayBuffer 和
ArrayBufferView 类型。由于字符串是密码学操作的重要应用场景,因此TextEncoder 和
TextDecoder 是经常与SubtleCrypto 一起使用的类,用于实现二进制数据与字符串之间的相互转换。
生成密码学摘要
计算数据的密码学摘要是非常常用的密码学操作。这个规范支持4 种摘要算法:SHA-1 和3 种
SHA-2。
 SHA-1(Secure Hash Algorithm 1):架构类似MD5 的散列函数。接收任意大小的输入,生成
160 位消息散列。由于容易受到碰撞攻击,这个算法已经不再安全。
 SHA-2(Secure Hash Algorithm 2):构建于相同耐碰撞单向压缩函数之上的一套散列函数。规
范支持其中3 种:SHA-256、SHA-384 和SHA-512。生成的消息摘要可以是256 位(SHA-256)、
384 位(SHA-384)或512 位(SHA-512)。这个算法被认为是安全的,广泛应用于很多领域和协
议,包括TLS、PGP 和加密货币(如比特币)。
SubtleCrypto.digest()方法用于生成消息摘要。要使用的散列算法通过字符串"SHA-1"、
“SHA-256”、"SHA-384"或"SHA-512"指定。下面的代码展示了一个使用SHA-256 为字符串"foo"生成消息摘要的例子:
(async function() {
const textEncoder = new TextEncoder();
const message = textEncoder.encode(‘foo’);
const messageDigest = await crypto.subtle.digest(‘SHA-256’, message);
console.log(new Uint32Array(messageDigest));
})();
// Uint32Array(8) [1806968364, 2412183400, 1011194873, 876687389,
// 1882014227, 2696905572, 2287897337, 2934400610]
通常,在使用时,二进制的消息摘要会转换为十六进制字符串格式。通过将二进制数据按8 位进行
分割,然后再调用toString(16)就可以把任何数组缓冲区转换为十六进制字符串:
(async function() {
const textEncoder = new TextEncoder();
const message = textEncoder.encode(‘foo’);
const messageDigest = await crypto.subtle.digest(‘SHA-256’, message);
const hexDigest = Array.from(new Uint8Array(messageDigest))
.map((x) => x.toString(16).padStart(2, ‘0’))
.join(‘’);
console.log(hexDigest);
})();
// 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae
软件公司通常会公开自己软件二进制安装包的摘要,以便用户验证自己下载到的确实是该公司发布
的版本(而不是被恶意软件篡改过的版本)。下面的例子演示了下载Firefox v67.0,通过SHA-512 计算
其散列,再下载其SHA-512 二进制验证摘要,最后检查两个十六进制字符串匹配:
(async function() {
const mozillaCdnUrl = ‘// downloadorigin.
cdn.mozilla.net/pub/firefox/releases/67.0 /’;
const firefoxBinaryFilename = ‘linux-x86_64/en-US/firefox-67.0.tar.bz2’;
const firefoxShaFilename = ‘SHA512SUMS’;
console.log(‘Fetching Firefox binary…’);
const fileArrayBuffer = await (await fetch(mozillaCdnUrl + firefoxBinaryFilename))
.arrayBuffer();
console.log(‘Calculating Firefox digest…’);
const firefoxBinaryDigest = await crypto.subtle.digest(‘SHA-512’, fileArrayBuffer);
const firefoxHexDigest = Array.from(new Uint8Array(firefoxBinaryDigest))
.map((x) => x.toString(16).padStart(2, ‘0’))
.join(‘’);
console.log(‘Fetching published binary digests…’);
// SHA 文件包含此次发布的所有Firefox 二进制文件的摘要,
// 因此要根据其格式进制拆分
const shaPairs = (await (await fetch(mozillaCdnUrl + firefoxShaFilename)).text())
.split(/\n/).map((x) => x.split(/\s+/));
let verified = false;
console.log(‘Checking calculated digest against published digests…’);
for (const [sha, filename] of shaPairs) {
if (filename === firefoxBinaryFilename) {
if (sha === firefoxHexDigest) {
verified = true;
break;
}
}
}
console.log(‘Verified:’, verified);
})();
// Fetching Firefox binary…
// Calculating Firefox digest…
// Fetching published binary digests…
// Checking calculated digest against published digests…
// Verified: true

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值