Node.js keyObject.type类
在 NodeJS 中,KeyObject 类代表特定算法的密钥,并包含用于处理加密密钥实例的内置函数或方法。
KeyObject.from(key): 这是一个内置于 KeyObject 类中的静态方法。用于从加密密钥或密钥对生成密钥对象。
语法: 将加密密钥实例转换为密钥对象形式的语法为:
keyObject.form( key )
- 键(key): 对称或非对称密钥
- keyObject.type: KeyObject的type方法指示生成的密钥是私有的、公共的还是私有的。对于对称密钥,keyObject.type返回secret,因为同一个密钥用于加密和解密。在使用非对称密钥时,加密和解密使用两个不同的密钥(公钥和私钥)。公钥对所有人都是可知的,但私钥保持私有,因此该方法对于私钥keyObject返回private类型,对于公钥keyObject返回public类型。
步骤1: 在终端中运行以下命令设置你的Node.js项目的package.json:
npm init
步骤2: 创建一个描述代码的app.js文件。
步骤3: 现在从NodeJS的crypto模块中导入所需的类或包。
步骤4: Subtle.generateKey()方法返回一个密码密钥(可以是对称密钥或非对称密钥对)。
语法: 以下是subtle.generateKey()方法的语法:
const key = generateKey(algorithm : Object , extractable : boolean , keyUsages : array);
参数:
- Algorithm: 一个对象,指定了我们想要生成的密钥类型以及进一步的算法细节。
- Extractable: 一个布尔变量,表示密钥是否可以被特定技术(如SubtleCrypto.exportKey())导出。如果为true,则密钥不可被导出。
- Keyusages: 一个数组,列出使用创建的密钥所必须采取的步骤。
以下是可能的值:
索引 | 值 | 描述 |
---|---|---|
1 | ['sign'] |
表示该密钥可用于生成数字签名。 |
2 | ['verify'] |
表示该密钥将用于验证数字签名。 |
3 | ['encrypt'] |
表示该密钥将用于加密通信。 |
4 | ['decrypt'] |
表示该密钥将用于解密通信。 |
5 | ['deriveKey'] |
表示该密钥将用于衍生密钥。 |
6 | ['deriveBits'] |
表示该密钥将用于衍生位数组。 |
7 | ['wrapKey'] |
表示可导出的密钥将以加密形式存储。 |
8 | ['unwrapKey'] |
表示可导出的密钥将以解密形式存储。 |
返回值: 一个包含结果值以及一些附加信息的对象。
步骤5: 使用 KeyObject.from(key) 方法并将生成的加密密钥值传递给该方法以生成keyObject。
示例1: 在这个示例中,我们将使用“AES-CBS”算法生成一个加密密钥,将这个加密密钥转换为keyObject,并检查这个keyObject的类型。
App.js
//Importing the crypto module
const {
webcrypto: { subtle }, KeyObject
} = require('node:crypto');
// Generating the crypto key that is
// not a keyObject.
(async function () {
const k = await subtle.generateKey({
// algorithm name
name: 'AES-CBC',
// length of key in bits.
length: 192,
},
// not exportable.
false,
// key can be used in encryption and decryption.
['encrypt', 'decrypt']);
// Converting cryptographic key into keyObject.
const key_obj = KeyObject.from(k);
// printing the type of keyObject.
console.log(key_obj.type)
})();
输出:
secret
示例2: 在这个示例中,我们将使用RSASSA-PKCS1-V1_5算法生成公钥和私钥的加密密钥对,并且针对每个加密密钥-公钥和私钥都运行keyObject.type方法。
//Importing the crypto module
const { Console } = require('node:console');
const {
webcrypto: { subtle }, KeyObject
} = require('node:crypto');
// async function
(async function () {
// generating the crypto key
// RSA Algorithm
const k = await subtle.generateKey(
{
// Algorithm name.
name: "RSASSA-PKCS1-v1_5",
// Length of RSA modulus in bits (number of bits).
modulusLength: 4096,
// Unit8Array - consists of 8-bit unsigned integers.
publicExponent: new Unit8Array([4, 5, 2]),
// digital hash function
hash: "SHA-256"
}
// Key is not exportable.
, false,
// Key can be used for generating and verifying
// the digital signature.
['sign', 'verify']
);
// Generating keyObject for private Key
const private_key_object = KeyObject.from(k.privateKey);
// printing the type of private KeyObject
console.log(private_key_object.type);
// Generating keyObject for public Key
const public_key_object = KeyObject.from(k.publicKey);
// printing the type of public KeyObject
console.log(public_key_object.type);
})();
输出:
private
public
参考文献: https://nodejs.org/api/crypto.html#class-keyobject