javascript基础学习系列三百三十九:使用SubtleCrypto对象

本文详细介绍了WebCryptographyAPI中的SubtleCrypto对象,它提供了一组用于加密、散列等密码学功能的方法。文章展示了如何使用SubtleCrypto进行消息摘要生成,以及在Firefox中验证软件包完整性的示例。
摘要由CSDN通过智能技术生成

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"生

注意 SubtleCrypto 对象只能在安全上下文(https)中使用。在不安全的上下文中, subtle 属性是 undefined。
成消息摘要的例子:

(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

Web Cryptography API

软件公司通常会公开自己软件二进制安装包的摘要,以便用户验证自己下载到的确实是该公司发布 的版本(而不是被恶意软件篡改过的版本)。下面的例子演示了下载 Firefox v67.0,通过 SHA-512 计算 22 其散列,再下载其 SHA-512 二进制验证摘要,最后检查两个十六进制字符串匹配:


(async function() {
const mozillaCdnUrl = '// download-
origin.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('Calculating Firefox digest...'); 25 const firefoxBinaryDigest = await crypto.subtle.digest('SHA-512', fileArrayBuffer); const firefoxHexDigest = Array.from(new Uint8Array(firefoxBinaryDigest))
console.log('Fetching Firefox binary...');
const fileArrayBuffer = await (await fetch(mozillaCdnUrl + firefoxBinaryFilename))
 .arrayBuffer();
.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、付费专栏及课程。

余额充值