javascript基础学习系列三百四十:CryptoKey 与算法

本文详细解释了SubtleCrypto中的CryptoKey类,包括RSA、ECC、AES等加密算法的原理和用途,如RSA的PKCS1、RSASSA-PKCS1-v1_5、RSA-PSS,以及AES的CTR、CBC、GCM和KW模式。同时介绍了如何使用SubtleCrypto.generateKey()生成满足特定条件的密钥。
摘要由CSDN通过智能技术生成

如果没了密钥,那密码学也就没什么意义了。SubtleCrypto 对象使用 CryptoKey 类的实例来生 成密钥。CryptoKey 类支持多种加密算法,允许控制密钥抽取和使用。
CryptoKey 类支持以下算法,按各自的父密码系统归类。
 RSA(Rivest-Shamir-Adleman):公钥密码系统,使用两个大素数获得一对公钥和私钥,可用
于签名/验证或加密/解密消息。RSA 的陷门函数被称为分解难题(factoring problem)。
 RSASSA-PKCS1-v1_5:RSA 的一个应用,用于使用私钥给消息签名,允许使用公钥验证签名。
 SSA(Signature Schemes with Appendix),表示算法支持签名生成和验证操作。
 PKCS1(Public-Key Cryptography Standards #1),表示算法展示出的 RSA 密钥必需的数学特性。  RSASSA-PKCS1-v1_5 是确定性的,意味着同样的消息和密钥每次都会生成相同的签名。
 RSA-PSS:RSA 的另一个应用,用于签名和验证消息。
 PSS(Probabilistic Signature Scheme),表示生成签名时会加盐以得到随机签名。
 与 RSASSA-PKCS1-v1_5 不同,同样的消息和密钥每次都会生成不同的签名。
 与 RSASSA-PKCS1-v1_5 不同,RSA-PSS 有可能约简到 RSA 分解难题的难度。 通常,虽然 RSASSA-PKCS1-v1_5 仍被认为是安全的,但 RSA-PSS 应该用于代替
RSASSA-PKCS1-v1_5。
 RSA-OAEP:RSA 的一个应用,用于使用公钥加密消息,用私钥来解密。
 OAEP(Optimal Asymmetric Encryption Padding),表示算法利用了 Feistel 网络在加密前处理未 加密的消息。
 OAEP 主要将确定性 RSA 加密模式转换为概率性加密模式。
 ECC(Elliptic-Curve Cryptography):公钥密码系统,使用一个素数和一个椭圆曲线获得一对公
钥和私钥,可用于签名/验证消息。ECC 的陷门函数被称为椭圆曲线离散对数问题(elliptic curve discrete logarithm problem)。ECC 被认为优于 RSA。虽然 RSA 和 ECC 在密码学意义上都很强, 但 ECC 密钥比 RSA 密钥短,而且 ECC 密码学操作比 RSA 操作快。
 ECDSA(Elliptic Curve Digital Signature Algorithm):ECC 的一个应用,用于签名和验证消息。 这个算法是数字签名算法(DSA,Digital Signature Algorithm)的一个椭圆曲线风格的变体。
 ECDH(Elliptic Curve Diffie-Hellman):ECC 的密钥生成和密钥协商应用,允许两方通过公开通 15 信渠道建立共享的机密。这个算法是 Diffie-Hellman 密钥交换(DH,Diffie-Hellman key exchange) 协议的一个椭圆曲线风格的变体。
AES(Advanced Encryption Standard):对称密钥密码系统,使用派生自置换组合网络的分组 密码加密和解密数据。AES 在不同模式下使用,不同模式算法的特性也不同。
 AES-CTR:AES 的计数器模式(counter mode)。这个模式使用递增计数器生成其密钥流,其行 为类似密文流。使用时必须为其提供一个随机数,用作初始化向量。AES-CTR 加密/解密可以 并行。
 AES-CBC:AES 的密码分组链模式(cipher block chaining mode)。在加密纯文本的每个分组之 前,先使用之前密文分组求 XOR,也就是名字中的“链”。使用一个初始化向量作为第一个分组 18 的 XOR 输入。
AES-GCM:AES 的伽罗瓦/计数器模式(Galois/Counter mode)。这个模式使用计数器和初始化 向量生成一个值,这个值会与每个分组的纯文本计算 XOR。与 CBC 不同,这个模式的 XOR 输 入不依赖之前分组密文。因此 GCM 模式可以并行。由于其卓越的性能,AES-GCM 在很多网络 安全协议中得到了应用。
 AES-KW:AES 的密钥包装模式(key wrapping mode)。这个算法将加密密钥包装为一个可移植 且加密的格式,可以在不信任的渠道中传输。传输之后,接收方可以解包密钥。与其他 AES 模 式不同,AES-KW 不需要初始化向量。

 RSA 密码系统使用 RsaHashedKeyGenParams 对象; 28
 HMAC(Hash-Based Message Authentication Code):用于生成消息认证码的算法,用于验证 通过不可信网络接收的消息没有被修改过。两方使用散列函数和共享私钥来签名和验证消息。
 KDF(Key Derivation Functions):可以使用散列函数从主密钥获得一个或多个密钥的算法。KDF 能够生成不同长度的密钥,也能把密钥转换为不同格式。
HKDF(HMAC-Based Key Derivation Function):密钥推导函数,与高熵输入(如已有密钥) 一起使用。
 PBKDF2(Password-Based Key Derivation Function 2):密钥推导函数,与低熵输入(如密钥 字符串)一起使用。
注意 CryptoKey支持很多算法,但其中只有部分算法能够用于SubtleCrypto的方法。
要了解哪个方法支持什么算法,可以参考 W3C 网站上 Web Cryptography API 规范的 “Algorithm Overview”。

生成 CryptoKey

使用 SubtleCrypto.generateKey()方法可以生成随机 CryptoKey,这个方法返回一个期约, 解决为一个或多个 CryptoKey 实例。使用时需要给这个方法传入一个指定目标算法的参数对象、一个 表示密钥是否可以从 CryptoKey 对象中提取出来的布尔值,以及一个表示这个密钥可以与哪个 SubtleCrypto 方法一起使用的字符串数组(keyUsages)。
由于不同的密码系统需要不同的输入来生成密钥,上述参数对象为每种密码系统都规定了必需的 输入:
 ECC 密码系统使用 EcKeyGenParams 对象;
 HMAC 密码系统使用 HmacKeyGenParams 对象;  AES 密码系统使用 AesKeyGenParams 对象。
keyUsages 对象用于说明密钥可以与哪个算法一起使用。至少要包含下列中的一个字符串:  encrypt
 decrypt
 sign
 verify
 deriveKey
 deriveBits
 wrapKey
 unwrapKey 假设要生成一个满足如下条件的对称密钥:
 支持 AES-CTR 算法;
 密钥长度 128 位;
 不能从 CryptoKey 对象中提取;
 可以跟 encrypt()和 decrypt()方法一起使用。 那么可以参考如下代码:

(async function() {
  const params = {
    name: 'AES-CTR',
    length: 128
  };
const keyUsages = ['encrypt', 'decrypt'];
const key = await crypto.subtle.generateKey(params, false, keyUsages);
  console.log(key);
// CryptoKey {type: "secret", extractable: true, algorithm: {...}, usages: Array(2)}
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值