JS在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
最小矩阵宽度(从第一列开始一列列加,直到判断子矩阵内包含数组的所有元素) 发布于:2025-04-16 19:10 最小交付时间(二分+回溯:先将数组排序,最小值start=Math.max(arr),最大值end = arr.reduce,回溯中创建一个新的工人数组,每次遍历数组时将数组中的每一个元素都尝试分配给worker[i]) 发布于:2025-04-16 18:53 阿里巴巴找黄金宝箱Ⅳ(单调栈:栈中存储单调递减的元素的集合,当找到比栈顶元素大的元素时,循环出栈直到栈顶元素不小于当前元素) 发布于:2025-04-15 17:47 找出经过特定点的路径长度(dfs+回溯) 发布于:2025-04-14 16:32 计算最接近的数(1.输入处理;2.对数组进行深拷贝,然后对新数组进行排序,之后在进行后续操作) 发布于:2025-04-14 15:11 MELON的难题(01背包问题:先判断数组和是否为偶数,如果为偶数直接输出-1,target=sum/2 状态转移方程dp[i]=Math.min(dp[i],dp[i-1]+1) 发布于:2025-04-11 17:29 简易内存池(模拟,双指针) 发布于:2025-04-11 17:12 通过软盘拷贝文件 这是一个典型的 0-1 背包问题的变体: 问题描述: 有一个容量为 1.44MB(1474560字节)的软盘 每个块大小为 512 字节 需要在有限容量内存储最大的文件字节总和 关键点: 文件大小以字节为单位 存储空间以块为单位 即使文件不足一个块,也要占用整个块的空间 动态规划解析: 状态定义:dp[i] 表示使用 i 个块时能存储的最大字节数 状态转移:对每个文件,可以选择放入或不放入 约束条件:总块数不能超过软盘容量 时间复杂度:O(n maxSize),其中: n 是文件数量 maxSize 是软盘最大块数(约2880块) 发布于:2025-04-11 16:39 正整数到excel编号之间的转换(对num先进行取余操作,取余之后的值就是字母a往后的偏移量,letter=String.fromCharCode('a'.charCodeAt(0)+remain),将这个字母放到结果队首,然后对num进行整除,循环直到num为0) 发布于:2025-04-10 17:46 最少交换次数(滑动窗口:先算出整个数组内<k的个数,作为窗口大小,然后再算出0-window内>=k的个数,作为res的初始值,然后滑动窗口,当arr[left]>=k时,res--,当arr[right]>=k时,res++) 发布于:2025-04-10 17:40 TLV解析 Ⅱ(字符串操作) 发布于:2025-04-10 16:24 最少有多少个小朋友了(相同的数字的个数/(相同个数+1)*(相同个数+1)) 发布于:2025-04-10 15:11 硬件产品销售方案(回溯 backtrack(path,val,sum)=>) 发布于:2025-04-09 18:40 猴子爬山(动态规划:状态转义方程dp[i]=dp[i-1]+dp[i-3]) 发布于:2025-04-09 18:14 检测工具代码 发布于:2025-04-09 18:03 检查是否存在满足条件的数字组合)(双指针,然后多重判断) 发布于:2025-04-09 17:45 阿里巴巴找黄金宝箱III(遍历数组,用map储存arr[i]上一次出现的下标,如果当前下标位置i-map.get(i)<=k,直接输出left) 发布于:2025-04-09 17:07 阿里巴巴找黄金宝箱II(数组排序,每次都找最大的减) 发布于:2025-04-09 16:48 全量和已占用字符集(字符串操作) 发布于:2025-04-09 16:34 微服务的集成测试(dfs:当扫描到第i行的第i个元素为1时,就递归dfs,sum+=Math.max(max,dfs(j))) 发布于:2025-04-09 16:25 经典屏保问题(判断是否反向:右下角坐标值为(x+50,y+25),当右下角撞到下面或者右边的墙时,就将x轴/y轴的移动方向反向,左上角同理。) 发布于:2025-04-08 18:37 阿里巴巴找黄金宝箱(I)(左右数组的和,如果左右数组的和相等,就输出) 发布于:2025-04-08 16:57 告警抑制(Map) 发布于:2025-04-08 16:35 过滤组合字符串(全排列:回溯) 发布于:2025-04-03 18:56 分糖果(判断是否为偶数,如果为偶数,操作次数+1,n=n/2;如果为奇数,判断(n+1)/2是否为偶数,如果是偶数,n=n+1,res++,否则n=n-1,res++) 发布于:2025-04-03 18:24 查找接口成功率最优时间段(用前缀和求出[left,right]区间的和,然后求平均值,和输入值比较,如果<=平均值,就移动右指针,如果>平均值,说明当前位置有一个当前最大的区间,比较这个区间是否为最大,如果不是则继续,如果是最大,则更新res结果;如果和当前的i最大值一样,那就将两个都放入到res中。最后,如果left和right不相等,说明最后一个窗口没处理完成,需要单独处理) 发布于:2025-04-03 18:15 游戏分组(dfs // 深度优先搜索函数 // 参数说明: // idx: 当前考虑的数组索引 // level: 当前已选择的数字个数 // subSum: 当前已选择数字的和 // totalSum: 整个数组的总和) 发布于:2025-04-03 17:18 新学校选址(找到一个数组排序后的中位数,如果是基数就是这个数,如果是偶数就是这个数的前一个数) 发布于:2025-04-03 16:38 绘图机器(从(0,0)到第一个点时,是先走横坐标,再走纵坐标,所以第一个点的面积应该为0) 发布于:2025-04-02 19:14 素数之积(判断是否为素数的函数:function isPrime(n) { if (n < 2) return false; for (let i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) return false; } return true; } 发布于:2025-04-02 17:43 考勤信息(滑动窗口统计七天之内的考勤状况) 发布于:2025-04-02 17:27 打印机队列(简单的数组模拟) 发布于:2025-04-02 16:29 JS AES128加解密 发布于:2025-04-03 15:28 找出重复代码】(二维动态规划:定义二维数组dp,初始值设为0,循环两个字符串,如果str1[i]=str2[j],dp[i+1][j+1]==dp[i][j]+1;使用maxLength定义当前最大的公共子串长度,如果dp[i+1][j+1]>maxLength,记录maxLength和当前结束位置i+1。循环后,根据maxLength和结束位置p,确定silce的范围 发布于:2025-04-01 19:24 【二叉树中序遍历】(用栈将二叉树的结构处理出来。然后中序遍历) 发布于:2025-04-01 19:08 【最小调整顺序次数】(模拟队列操作:当插入操作为头操作时,如果数组不为空,就不是排序状态。尾插入不影响;当移除元素时,如果当前队列是有序的 ,就不需要操作,否则就需要操作,ans++) 发布于:2025-04-01 18:29 二元组个数】(用map存储第一个数组中出现的元素及个数,然后遍历第二个数组,如果遇到map中的元素,ans+=map.get()) 发布于:2025-04-01 18:02 【文件目录大小】(递归:先读取每个文件的信息,解析每行输入的三个部分:id,size,child并将处理过后的放入files中,files:{id,size,child}。然后递归计算目标目录的大小:自定义一个递归函数 getSize,将目标目录设为root节点,向下递归子文件夹,如果有子文件夹就递归计算所有子节点的大小并累加,最后返回结果) 发布于:2025-04-01 17:49 华为OD机试真题 Python 实现【水库蓄水问题】(变体接雨水问题,用双指针遍历数组,然后将子数组内的每一个数字能接到的雨水相加(如果当前位置数字 小于左右边界的最小值,能够接水),如果有多个位置接的雨水相同,保留right-left最小的) 发布于:2025-04-01 17:23 找出两个整数数组中同时出现的整数】(用map存储第一个数组中的元素,然后再循环第二个数组,当遇到map中有的数字时,记录下这个数字。再创建新的Map,按出现次数分组存储数字// 获取当前数字及其在第一个数组中的出现次数// 将数字添加到对应次数的组中,并保持组内数字有序;// 获取所有出现次数并按升序排序// 按格式输出结果) 发布于:2025-04-01 16:47 模拟消息队列(两个数组,一个用来存消息,一个用来存接受者,接受者的中包括订阅时间取消时间和能接收到的消息,正序循环message数组,在逆序循环接受者数组,每当有发送消息的时间在订阅和取关之间时,把这个消息放到消息队列中) 发布于:2025-04-01 16:22 【投篮大赛】(简单字符串操作) 发布于:2025-04-01 16:05 【数值同化】(广度优先搜索,搜索能够到达的所有格子,然后遍历矩阵找出无法到达的地区) 发布于:2025-04-01 15:29 数字加减游戏(数学问题:先判断目标-初始是否能被b整除,如果能直接输出0.如果不能就每次判断初始值+a*x或初始值-a*x是否能整除b,如果能,就时最优解) 发布于:2025-04-01 15:10 数组二叉树(// 遍历树中的所有节点,寻找最小的叶子节点 // 判断当前节点是否为叶子节点,需满足以下条件: // 1. 节点值不为 -1(不是空节点) // 2. 节点值小于当前找到的最小叶子值 // 3. 左子节点不存在(超出数组范围或为-1) // 4. 右子节点不存在(超出数组范围或为-1) // 更新最小叶子节点的索引和值,找到叶子节点后,根据叶子节点不断向上推导出父节点,直到找到根节点。对于索引i,其父节点索引为 floor((i-1)/2)) 发布于:2025-04-01 14:56 【招聘】计算至少需要的面试官数量( // 核心算法思路: // 1. 首先对所有面试时间区间按开始时间排序 // 2. 检查相邻区间是否存在时间重叠 // 3. 对于重叠的区间,需要额外的面试官 // 4. 最后根据重叠情况和每个面试官的面试次数限制(m)计算所需面试官总数) 发布于:2025-03-31 18:44 查找一个有向网络的头节点和尾节点(读取输入数据并解析 统计每个节点的入度和出度 使用Map存储节点的入度和出度 每处理一条边,同时更新起点和终点的度数 入度为0的节点是起点 出度为0的节点是终点 终点需要降序排序 检查是否存在起点和终点 收集所有起点和终点 对终点进行排序 输出结果) 发布于:2025-03-31 17:51 数字序列比大小(田忌赛马:首先对两个数组进行升序排序 对arrA中的每个元素: 在arrB中查找第一个大于等于它的元素 如果找到,使用该位置的前一个元素进行匹配(得1分) 如果找不到,使用arrB的最后一个元素(得-1分)) 发布于:2025-03-31 17:20 寻找最大价值的矿堆(BFS函数实现: 参数:起始位置(i,j) 功能: 计算从起始位置开始的连通区域的和 使用BFS遍历所有相邻的位置 将已访问的位置标记为0 返回连通区域的和 主要流程: 读取矩阵数据 遍历矩阵的每个位置 对未访问的位置进行BFS 更新最大连通区域的和 关键点: 使用0标记已访问的位置 只处理值大于0的位置 考虑四个方向的相邻位置 使用Math.max更新最大和) 发布于:2025-03-31 16:53 仿LISP运算(遍历输入字符串的每个字符,遇到右括号或空格时,处理已收集的字符 遇到右括号时,进行运算,收集非括号和空格的字符;运算时从栈中弹出两个操作数和一个运算符,根据运算符执行相应的运算,将运算结果压入栈中,处理除数为0的特殊情况) 发布于:2025-03-31 16:35 [更多]
显示目录

加密



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

加密

稳定性: 2 - 不稳定; 正在讨论未来版本的 API 改进,会尽量减少重大变化。详见后文。

顾名思义,Node.js加密模块允许你使用加密的功能,Node.js加密模块通过使用require('crypto')来访问。

Node.js加密模块提供了HTTP或HTTPS连接过程中封装安全凭证的方法。

Node.js加密模块还提供了OpenSSL的哈希,hmac、加密(cipher)、解密(decipher)、签名(sign)和验证(verify)方法的封装。

crypto.setEngine(engine[, flags])

为某些/所有OpenSSL函数加载并设置引擎(根据参数flags来设置)。

engine可能是id,或者是指向引擎共享库的路径。

flags是可选参数,默认值是ENGINE_METHOD_ALL,它可以是以下一个或多个参数的组合(在constants里定义):

  • ENGINE_METHOD_RSA
  • ENGINE_METHOD_DSA
  • ENGINE_METHOD_DH
  • ENGINE_METHOD_RAND
  • ENGINE_METHOD_ECDH
  • ENGINE_METHOD_ECDSA
  • ENGINE_METHOD_CIPHERS
  • ENGINE_METHOD_DIGESTS
  • ENGINE_METHOD_STORE
  • ENGINE_METHOD_PKEY_METH
  • ENGINE_METHOD_PKEY_ASN1_METH
  • ENGINE_METHOD_ALL
  • ENGINE_METHOD_NONE

crypto.getCiphers()

返回支持的加密算法名数组。

例如:

var ciphers = crypto.getCiphers();
console.log(ciphers); // ['AES-128-CBC', 'AES-128-CBC-HMAC-SHA1', ...]

crypto.getHashes()

返回支持的哈希算法名数组。

例如:

var hashes = crypto.getHashes();
console.log(hashes); // ['sha', 'sha1', 'sha1WithRSAEncryption', ...]

crypto.createCredentials(details)

稳定性: 0 - 抛弃。用 [tls.createSecureContext][] 替换

根据参数details,创建一个加密凭证对象。参数为字典,key包括:

  • pfx: 字符串或者buffer对象,表示经PFX或PKCS12编码产生的私钥、证书以及CA证书
  • key: 进过 PEM 编码的私钥
  • passphrase: 私钥或pfx的密码
  • cert: PEM编码的证书
  • ca: 字符串或字符串数组,PEM编码的可信任的CA证书。
  • crl: 字符串或字符串数组,PEM编码的CRLs(证书吊销列表Certificate Revocation List)。
  • ciphers: 字符串,使用或者排除的加密算法。参见http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT

如果没有指定'ca',Node.js将会使用下面列表中的CAhttp://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt

crypto.createHash(algorithm)

创建并返回一个哈希对象,使用指定的算法来生成哈希摘要。

参数algorithm取决于平台的OpenSSL版本所支持的算法。例如,'sha1''md5''sha256''sha512'等等。在最近的版本中,openssllist-message-digest-algorithms会显示所有算法。

例如: 这个程序会计算文件的sha1的和。

var filename = process.argv[2];
var crypto = require('crypto');
var fs = require('fs');

var shasum = crypto.createHash('sha1');

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  shasum.update(d);
});

s.on('end', function() {
  var d = shasum.digest('hex');
  console.log(d + '  ' + filename);
});

类:Hash

Hase用来生成数据的哈希值。

它是可读写的流stream。写入的数据来用计算哈希值。当写入流结束后,使用read()方法来获取计算后的哈希值。也支持旧的updatedigest方法。

通过crypto.createHash返回。

hash.update(data[, input_encoding])

根据data来更新哈希内容,编码方式根据input_encoding来定,有'utf8''ascii''binary'。如果没有传入值,默认编码方式是'binary'。如果 dataBuffer,则input_encoding将会被忽略。

因为它是流式数据,所以可以使用不同的数据调用很多次。

hash.digest([encoding])

计算传入的数据的哈希摘要。

encoding可以是'hex''binary''base64',如果没有指定encoding,将返回buffer。
注意:调用digest()后不能再用hash对象。

crypto.createHmac(algorithm, key)

创建并返回一个hmac对象,用指定的算法和秘钥生成hmac图谱。

它是可读写的流stream。写入的数据来用计算hmac。当写入流结束后,使用read()方法来获取计算后的值。也支持旧的updatedigest方法。

参数algorithm取决于平台上OpenSSL版本所支持的算法,参见前面的createHash。key是hmac算法中用的key。

类:Hmac

用来创建hmac加密图谱。

通过crypto.createHmac返回。

hmac.update(data)

根据data更新hmac对象。因为它是流式数据,所以可以使用新数据调用多次。

hmac.digest([encoding])

计算传入数据的hmac值。encoding可以是'hex''binary''base64',如果没有指定encoding,将返回buffer。

注意:调用digest()后不能再用hmac对象。

crypto.createCipher(algorithm, password)

使用传入的算法和秘钥来生成并返回加密对象。

algorithm取决于OpenSSL,例如'aes192'等。最近发布的版本中,openssl list-cipher-algorithms将会展示可用的加密算法。password用来派生key 和IV,它必须是一个'binary'编码的字符串或者一个buffer

它是可读写的stream流。写入的数据来用计算hmac。当写入流结束后,使用read()方法来获取计算后的值。也支持老的updatedigest方法。

注意,OpenSSL函数EVP_BytesToKey摘要算法如果是一次迭代(one iteration),无需盐值(no salt)的MD5时,createCipher为它派生秘钥。缺少盐值使得字典攻击,相同的密码总是生成相同的key,低迭代次数和非加密的哈希算法,使得密码测试非常迅速。

OpenSSL推荐使用pbkdf2来替换EVP_BytesToKey,推荐使用crypto.pbkdf2来派生key和iv ,推荐使用createCipheriv()来创建加密流。

crypto.createCipheriv(algorithm, key, iv)

创建并返回一个加密对象,用指定的算法,key和iv。

algorithm参数和createCipher()一致。key在算法中用到。iv是一个initialization vector.

keyiv必须是'binary'的编码字符串或buffers.

类: Cipher

加密数据的类。.

通过crypto.createCiphercrypto.createCipheriv返回。

它是可读写的stream流。写入的数据来用计算hmac。当写入流结束后,使用read()方法来获取计算后的值。也支持旧的updatedigest方法。

cipher.update(data[, input_encoding][, output_encoding])

根据data来更新哈希内容,编码方式根据input_encoding来定,有'utf8''ascii'或者'binary'。如果没有传入值,默认编码方式是'binary'。如果dataBufferinput_encoding将会被忽略。

output_encoding指定了输出的加密数据的编码格式,它可用是'binary''base64''hex'。如果没有提供编码,将返回buffer。

返回加密后的内容,因为它是流式数据,所以可以使用不同的数据调用很多次。

cipher.final([output_encoding])

返回加密后的内容,编码方式是由output_encoding指定,可以是'binary''base64''hex'。如果没有传入值,将返回buffer。

注意:cipher对象不能在final()方法之后调用。

cipher.setAutoPadding(auto_padding=true)

你可以禁用输入数据自动填充到块大小的功能。如果auto_padding是false, 那么输入数据的长度必须是加密器块大小的整倍数,否则final会失败。这对非标准的填充很有用,例如使用0x0而不是PKCS的填充。这个函数必须在cipher.final之前调用。

cipher.getAuthTag()

加密认证模式(目前支持:GCM),这个方法返回经过计算的认证标志Buffer。必须使用final方法完全加密后调用。

cipher.setAAD(buffer)

加密认证模式(目前支持:GCM),这个方法设置附加认证数据( AAD )。

crypto.createDecipher(algorithm, password)

根据传入的算法和密钥,创建并返回一个解密对象。这是createCipher()的镜像。

crypto.createDecipheriv(algorithm, key, iv)

根据传入的算法,密钥和iv,创建并返回一个解密对象。这是createCipheriv()的镜像。

类:Decipher

解密数据类。

通过crypto.createDeciphercrypto.createDecipheriv返回。

解密对象是可读写的streams流。用写入的加密数据生成可读的纯文本数据。也支持老的updatedigest方法。

decipher.update(data[, input_encoding][, output_encoding])

使用参数data更新需要解密的内容,其编码方式是'binary''base64''hex'。如果没有指定编码方式,则把data当成buffer对象。

如果dataBuffer,则忽略input_encoding参数。

参数output_decoding指定返回文本的格式,是'binary''ascii''utf8'之一。如果没有提供编码格式,则返回buffer。

decipher.final([output_encoding])

返回剩余的解密过的内容,参数output_encoding'binary''ascii''utf8',如果没有指定编码方式,返回buffer。

注意:decipher对象不能在final()方法之后使用。

decipher.setAutoPadding(auto_padding=true)

如果加密的数据是非标准块,可以禁止其自动填充,防止decipher.final检查并移除。仅在输入数据长度是加密块长度的整数倍的时才有效。你必须在 decipher.update前调用。

decipher.setAuthTag(buffer)

对于加密认证模式(目前支持:GCM),必须用这个方法来传递接收到的认证标志。如果没有提供标志,或者密文被篡改,将会抛出final标志,认证失败,密文会被抛弃。

decipher.setAAD(buffer)

对于加密认证模式(目前支持:GCM),用这个方法设置附加认证数据( AAD )。

crypto.createSign(algorithm)

根据传入的算法创建并返回一个签名数据。 OpenSSL的最近版本里,openssl list-public-key-algorithms会列出所有算法,比如'RSA-SHA256'

类:Sign

生成数字签名的类。

通过crypto.createSign返回。

签名对象是可读写的streams流。可写数据用来生成签名。当所有的数据写完,sign签名方法会返回签名。也支持老的updatedigest方法。

sign.update(data)

用参数data来更新签名对象。因为是流式数据,它可以被多次调用。

sign.sign(private_key[, output_format])

根据传送给sign的数据来计算电子签名。

private_key可以是一个对象或者字符串。如果是字符串,将会被当做没有密码的key。

private_key:

  • key: 包含 PEM 编码的私钥
  • passphrase: 私钥的密码

返回值output_format包含数字签名, 格式是'binary''hex''base64'之一。如果没有指定encoding,将返回buffer。

注意:sign对象不能在sign()方法之后调用。

crypto.createVerify(algorithm)

根据传入的算法,创建并返回验证对象。是签名对象(signing object)的镜像。

类: Verify

用来验证签名的类。

通过crypto.createVerify返回。

是可写streams流。可写数据用来验证签名。一旦所有数据写完后,如签名正确verify方法会返回true

也支持老的update方法。

verifier.update(data)

用参数data来更新验证对象。因为是流式数据,它可以被多次调用。

verifier.verify(object, signature[, signature_format])

使用objectsignature验证签名数据。参数object是包含了PEM编码对象的字符串,它可以是RSA公钥,DSA公钥,或X.509证书。signature是之前计算出来的数字签名。signature_format可以是'binary''hex''base64'之一,如果没有指定编码方式 ,则默认是buffer对象。

根据数据和公钥验证签名有效性,来返回true或false。

注意:verifier对象不能在verify()方法之后调用。

crypto.createDiffieHellman(prime_length[, generator])

创建一个Diffie-Hellman密钥交换(Diffie-Hellman key exchange)对象,并根据给定的位长度生成一个质数。如果没有指定参数generator,默认为2

crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])

使用传入的primegenerator创建Diffie-Hellman秘钥交互对象。

generator可以是数字,字符串或Buffer。

如果没有指定generator,使用2.

prime_encodinggenerator_encoding可以是'binary''hex''base64'

如果没有指定prime_encoding, 则Buffer为prime

如果没有指定generator_encoding ,则Buffer为generator

类:DiffieHellman

创建Diffie-Hellman秘钥交换的类。

通过crypto.createDiffieHellman返回。

diffieHellman.verifyError

在初始化的时候,如果有警告或错误,将会反应到这。它是以下值(定义在constants模块):

  • DH_CHECK_P_NOT_SAFE_PRIME
  • DH_CHECK_P_NOT_PRIME
  • DH_UNABLE_TO_CHECK_GENERATOR
  • DH_NOT_SUITABLE_GENERATOR

diffieHellman.generateKeys([encoding])

生成秘钥和公钥,并返回指定格式的公钥。这个值必须传给其他部分。编码方式:'binary''hex''base64'。如果没有指定编码方式,将返回buffer。

diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])

使用other_public_key作为第三方公钥来计算并返回共享秘密(shared secret)。秘钥用input_encoding编码。编码方式为:'binary''hex''base64'。如果没有指定编码方式 ,默认为buffer。

如果没有指定返回编码方式,将返回buffer。

diffieHellman.getPrime([encoding])

用参数encoding指明的编码方式返回Diffie-Hellman质数,编码方式为: 'binary''hex''base64'。如果没有指定编码方式,将返回buffer。

diffieHellman.getGenerator([encoding])

用参数encoding指明的编码方式返回Diffie-Hellman生成器,编码方式为: 'binary''hex''base64'。如果没有指定编码方式 ,将返回buffer。

diffieHellman.getPublicKey([encoding])

用参数encoding指明的编码方式返回Diffie-Hellman公钥,编码方式为: 'binary''hex', 或'base64'。如果没有指定编码方式 ,将返回buffer。

diffieHellman.getPrivateKey([encoding])

用参数encoding指明的编码方式返回Diffie-Hellman私钥,编码方式为: 'binary''hex''base64'。如果没有指定编码方式 ,将返回buffer。

diffieHellman.setPublicKey(public_key[, encoding])

设置Diffie-Hellman的公钥,编码方式为: 'binary''hex''base64',如果没有指定编码方式 ,默认为buffer。

diffieHellman.setPrivateKey(private_key[, encoding])

设置Diffie-Hellman的私钥,编码方式为: 'binary''hex''base64',如果没有指定编码方式 ,默认为buffer。

crypto.getDiffieHellman(group_name)

创建一个预定义的Diffie-Hellman秘钥交换对象。支持的组: 'modp1''modp2''modp5'(定义于RFC 2412),并且'modp14''modp15''modp16''modp17''modp18'(定义于RFC 3526)。返回对象模仿了上述创建的crypto.createDiffieHellman()对象,但是不允许修改秘钥交换(例如,diffieHellman.setPublicKey())。使用这套流程的好处是,双方不需要生成或交换组组余数,节省了计算和通讯时间。

例如 (获取一个共享秘密):

var crypto = require('crypto');
var alice = crypto.getDiffieHellman('modp5');
var bob = crypto.getDiffieHellman('modp5');

alice.generateKeys();
bob.generateKeys();

var alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
var bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

/* alice_secret and bob_secret should be the same */
console.log(alice_secret == bob_secret);

crypto.createECDH(curve_name)

使用传入的参数curve_name,创建一个Elliptic Curve (EC) Diffie-Hellman秘钥交换对象。

类:ECDH

这个类用来创建EC Diffie-Hellman秘钥交换。

通过crypto.createECDH返回。

ECDH.generateKeys([encoding[, format]])

生成EC Diffie-Hellman的秘钥和公钥,并返回指定格式和编码的公钥,它会传递给第三方。

参数format'compressed''uncompressed''hybrid'。如果没有指定,将返回'uncompressed'格式.

参数encoding'binary''hex''base64'。如果没有指定编码方式,将返回buffer。

ECDH.computeSecret(other_public_key[, input_encoding][, output_encoding])

other_public_key作为第三方公钥计算共享秘密,并返回。秘钥会以input_encoding来解读。编码是:'binary''hex''base64'。如果没有指定编码方式,默认为buffer。

如果没有指定编码方式,将返回buffer。

ECDH.getPublicKey([encoding[, format]])

用参数encoding指明的编码方式返回EC Diffie-Hellman公钥,编码方式为: 'compressed''uncompressed''hybrid'。如果没有指定编码方式 ,将返回'uncompressed'

编码是:'binary''hex''base64'。如果没有指定编码方式 ,默认为buffer。

ECDH.getPrivateKey([encoding])

用参数encoding指明的编码方式返回EC Diffie-Hellman私钥,编码是:'binary''hex''base64'。如果没有指定编码方式 ,默认为buffer。

ECDH.setPublicKey(public_key[, encoding])

设置EC Diffie-Hellman的公钥,编码方式为: 'binary''hex''base64',如果没有指定编码方式,默认为buffer。

ECDH.setPrivateKey(private_key[, encoding])

设置EC Diffie-Hellman的私钥,编码方式为: 'binary''hex''base64',如果没有指定编码方式,默认为buffer。

例如 (包含一个共享秘密):

var crypto = require('crypto');
var alice = crypto.createECDH('secp256k1');
var bob = crypto.createECDH('secp256k1');

alice.generateKeys();
bob.generateKeys();

var alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
var bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

/* alice_secret and bob_secret should be the same */
console.log(alice_secret == bob_secret);

crypto.pbkdf2(password, salt, iterations, keylen[, digest], callback)

异步PBKDF2提供了一个伪随机函数HMAC-SHA1,根据给定密码的长度,salt和iterations来得出一个密钥。回调函数得到两个参数 (err, derivedKey)。

例如:

crypto.pbkdf2('secret', 'salt', 4096, 512, 'sha256', function(err, key) {
  if (err)
    throw err;
  console.log(key.toString('hex'));  // 'c5e478d...1469e50'
});

crypto.getHashes()里有支持的摘要函数列表。

crypto.pbkdf2Sync(password, salt, iterations, keylen[, digest])

异步PBKDF2函数, 返回derivedKey或抛出错误。

crypto.randomBytes(size[, callback])

生成一个密码强度随机的数据:

// async
crypto.randomBytes(256, function(ex, buf) {
  if (ex) throw ex;
  console.log('Have %d bytes of random data: %s', buf.length, buf);
});

// sync
try {
  var buf = crypto.randomBytes(256);
  console.log('Have %d bytes of random data: %s', buf.length, buf);
} catch (ex) {
  // handle error
  // most likely, entropy sources are drained
}

注意:如果没有足够积累的熵来生成随机强度的密码,将会抛出错误,或调用回调函数返回错误。换句话说,没有回调函数的crypto.randomBytes不会阻塞,即使耗尽所有的熵。

crypto.pseudoRandomBytes(size[, callback])

生成非密码学强度的伪随机数据。如果数据足够长会返回一个唯一数据,但是这个数可能是可以预期的。因此,当不可预期很重要的时候,不要用这个函数。例如,在生成加密的秘钥时。

用法和crypto.randomBytes相同。

类: Certificate

这个类和签过名的公钥打交道。最重要的场景是处理<keygen>元素,http://www.openssl.org/docs/apps/spkac.html

通过crypto.Certificate返回.

Certificate.verifySpkac(spkac)

根据SPKAC返回true或false。

Certificate.exportChallenge(spkac)

根据提供的SPKAC,返回加密的公钥。

Certificate.exportPublicKey(spkac)

输出和SPKAC关联的编码challenge。

crypto.publicEncrypt(public_key, buffer)

使用public_key加密buffer。目前仅支持RSA。

public_key可以是对象或字符串。如果public_key是一个字符串,将会当做没有密码的key,并会用RSA_PKCS1_OAEP_PADDING

public_key:

  • key: 包含有PEM编码的私钥。
  • padding: 填充值,如下
    • constants.RSA_NO_PADDING
    • constants.RSA_PKCS1_PADDING
    • constants.RSA_PKCS1_OAEP_PADDING

注意:所有的填充值定义在constants模块.

crypto.privateDecrypt(private_key, buffer)

使用private_key来解密buffer.

private_key:

  • key: 包含有 PEM 编码的私钥
  • passphrase: 私钥的密码
  • padding: 填充值,如下:
    • constants.RSA_NO_PADDING
    • constants.RSA_PKCS1_PADDING
    • constants.RSA_PKCS1_OAEP_PADDING

注意:所有的填充值定义于constants模块.

crypto.DEFAULT_ENCODING

函数所用的编码方式可以是字符串或buffer ,默认值是'buffer'。这是为了加密模块兼容默认'binary'为编码方式的遗留程序。

注意:新程序希望用buffer对象,所以这是暂时手段。

Recent API Changes

在统一的流API概念出现前,在引入Buffer对象来处理二进制数据之前,Crypto模块就已经添加到Node。

因此,流相关的类里没有其他的Node类里的典型方法,并且很多方法接收并返回二级制编码的字符串,而不是Buffers。在最近的版本中,这些函数改成默认使用 Buffers。

对于一些场景来说这是重大变化。

例如,如果你使用默认参数给签名类,将结果返回给认证类,中间没有验证数据,程序会正常工作。之前你会得到二进制编码的字符串,并传递给验证类,现在则是 Buffer。

如果你之前使用的字符串数据在Buffers对象不能正常工作(比如,连接数据,并存储在数据库里 )。或者你传递了二进制字符串给加密函数,但是没有指定编码方式,现在就需要提供编码参数。如果想切换回原来的风格,将crypto.DEFAULT_ENCODING设置为'binary'。注意,新的程序希望是buffers,所以之前的方法只能作为临时的办法。

由JSRUN为你提供的JS在线运行、在线编译工具
        JSRUN提供的JS 在线运行,JS 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout