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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript中的对象是一种无序的键/值对集合。您可以使用对象来存储任意数据类型,并且可以使用键来访问这些数据。 创建对象的方式有多种,其中一种是使用对象字面量语法: ``` let obj = { key1: value1, key2: value2, ... }; ``` 您也可以使用构造函数来创建对象: ``` let obj = new Object(); obj.key1 = value1; obj.key2 = value2; ... ``` JavaScript还提供了一种称为原型的机制,可以在一个对象基础上创建新对象。您可以使用Object.create()来创建一个新对象,并将其关联到另一个对象: ``` let obj1 = {key1: value1}; let obj2 = Object.create(obj1); ``` 访问对象中的值可以使用点语法或中括号语法: ``` console.log(obj.key1); console.log(obj['key1']); ``` 对象可以嵌套,创建多级对象 ``` let obj = { key1: { key2: { key3: value } } }; ``` JavaScript还提供了一种称为原型的机制,可以在一个对象基础上创建新对象。 ### 回答2: JavaScript是一种重要的脚本语言,它的强大之处在于它的对象。可以把JavaScript对象看作是创建Web应用程序的基石。 JavaScript对象是一种复合数据类型,由属性和方法组成。每个对象都包含一组属性和方法,它们可以通过对象的名字来调用或者访问。对象可以创造新的属性和方法,也可以从其他对象继承属性和方法。JavaScript提供的对象类型有三种:原始对象、内置对象和宿主对象。 原始对象是指通过原型链创建的对象,它由用户自己定义或系统预定义的对象来创建。内置对象是指由JavaScript语言预定义的对象类型,这些对象JavaScript的核心,在任何JavaScript环境下都可以使用。宿主对象是指由浏览器或服务器环境提供的对象类型,可以用来操作系统、浏览器或者其他外部环境。 对象JavaScript的核心概念之一,所以对于JavaScript初学者来说,学习对象是非常重要的。在学习对象之前,需要先掌握基本的语法和编程概念,例如变量、函数和循环等。在学习对象之后,可以掌握面向对象编程的思想,用对象的方式来组织和管理代码,使得代码更加清晰和易于维护。 总之,学习JavaScript对象是非常重要的,因为它们是JavaScript编程的核心和基石。掌握JavaScript对象可以让你更好地理解JavaScript编程的本质,从而更好地开发Web应用程序。 ### 回答3: JavaScript是一门面向对象语言,它的核心特性之一就是对象。JS对象是一组属性的集合,每个属性都由一个字符串和一个值组成,这个值可以是函数。对象可用于封装数据和功能,以及创建可重复使用的代码块,从而实现更高效的编程。 在JavaScript中,对象的创建方式有两种:字面量和构造函数。字面量方式创建对象非常简单,只需要按照对象的键-值对方式来书写,如下所示: ```javascript var person = { name: 'Alice', age: 20, sayHello: function() { console.log("Hello, I'm "+this.name); } } ``` 上述代码中,我们定义了一个名为`person`的对象,它有两个属性`name`和`age`,以及一个方法`sayHello`。使用字面量方式创建对象,我们可以很方便地定义对象的初始状态。 另一种创建对象的方式是构造函数。构造函数本质上是一种特殊的函数,以函数的形式返回一个新的对象,实现对象的构建。`new`操作符用来创建对象的实例,如下所示: ```javascript function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.log("Hello, I'm "+this.name); }; } var person1 = new Person('Bob', 30); var person2 = new Person('Charlie', 40); ``` 在上述代码中,我们创建了一个名为`Person`的构造函数,这个函数接受两个参数`name`和`age`,并将它们赋值给对象的属性。使用`new`操作符创建实例`person1`和`person2`时,会执行构造函数,并返回一个新的对象。 除了创建对象JavaScript还提供了一些内置对象,如`Math`、`Date`、`String`、`Array`等。这些内置对象提供了一些预定义的属性和方法,使得编写JavaScript代码更加高效和简便。 总而言之,理解JavaScript对象及其使用方式是非常重要的,因为大多数JavaScript代码都是围绕对象进行的。只有深入了解对象,才能更好地进行JavaScript编程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值