Node.js 中的 crypto.scrypt() 方法

该方法为 scrypt 方法提供了异步实现。scrypt 可以定义为基于密码的密钥派生函数,它可以保护系统免受蛮力攻击并使其无法获得奖励。但是脚本函数在计算和内存方面都很昂贵。crypto.scrypt()

语法

crypto.scrypt(password, salt, keylen, [options], [callback])

参数

上述参数描述如下 -

  • 密码 – 解码条目所需的 scrypt 的密码字段。它可以是字符串、对象、TypedArray 等。

  • salt  – 该值应尽可能唯一。这主要用于加密数据。盐的最小建议长度为 16 字节。

  • keylen  – 该参数定义了密钥的长度,应该是一个数字。

  • 选项

    • cost  - 这是每个内存占用的 CPU 成本。此值应为大于 1 的 2 的幂。默认值为 16384。

    • blockSize  – 此参数定义了每个块大小的值。默认值为 8。

    • 并行化 ——这个参数定义了并行化参数。默认值为 1。

    • – 此参数是成本的别名,可以代替它使用。一次只能定义一个。

    • – 此参数是 blockSize 的别名,同样一次只能定义一个。

    • – 并行化的别名。只能定义一个。

    • maxmem  - 这是内存上限值。当 128*N*r > maxmem 时抛出错误。默认值为 32*1024*1024。

  • 回调- 如果您想处理它,则在抛出错误时调用 此函数。

示例

创建一个具有名称的文件 -scrypt.js并复制以下代码片段。创建文件后,使用以下命令运行此代码,如下例所示 -

node scrypt.js

scrypt.js

//Node.jsprogram 演示了 crypto.scrypt() 方法的流程

// 导入加密模块
var crypto = require('crypto');

// 使用以下参数调用 scrypt() 方法
crypto.scrypt('nhooo', 'asdfghjkl', 32, (err, derivedKey) => {

if (err) throw err;

// 将派生密钥打印为缓冲区值
console.log("The derived key(1) is:", derivedKey);
});

// 使用 cost 选项调用 scrypt() 方法
crypto.scrypt('GeeksforGeeks', 'tfytdx', 128,
   { N: 512 }, (err, derivedKey) => {

if (err) throw err;

// 将派生密钥打印为缓冲区值
console.log("The derived key(2) is:", derivedKey);
console.log();
});
输出结果
C:\home\node>> node scrypt.js
The derived key(2) is: <Buffer b3 f8 72 5f 58 df 98 d9 c0 8a ba 0c 2c 50 85 b1
76 de 39 35 40 27 7d 57 f1 6a a1 07 54 dc c9 63 65 32 f2 db 29 95 dc ee 0b 9f
e3 d5 0a 9e 3a d0 f6 b4 ... >

The derived key(1) is: <Buffer ae 50 38 61 17 f7 11 51 e4 50 63 3c 2a 9c ec f0
46 42 a6 ca 04 78 67 05 c8 8c 0c 69 00 c3 03 7f>

示例

让我们再看一个例子。

//Node.jsprogram 演示了 crypto.scrypt() 方法的流程

// 导入加密模块
var crypto = require('crypto');

// 将 salt 的值初始化为 typedArray
const salt = new Uint32Array(7);

// 使用带有以下参数的 scrypt() 方法
crypto.scrypt('WelcomeNhooo', salt, 16, (err, derivedKey) => {
   if (err) throw err;
   // 以编码字符串格式打印派生密钥
   console.log("The derived key(1) is:",
      derivedKey.toString("ascii"));
});

// 将 salt 的值初始化为 DataView
const newSalt = new DataView(new ArrayBuffer(5));

// 使用带有成本参数的 script() 方法
crypto.scrypt('HelloNhooo', newSalt, 16, { N: 32 }, (err, derivedKey) => {
   if (err) throw err;
   // 以编码字符串格式打印派生密钥
   console.log("The derived key(2) is:",
      derivedKey.toString("base64"));
});
输出结果
C:\home\node>> node scrypt.js
The derived key(2) is: PBYDRlgayLVGjC8z3YUcSQ==
The derived key(1) is: <Uu0allCb,d?,Z5_