crypto
crypto
crypto包含了加解密相关的api
crypto
函数 | 类型 | 参数 | 返回值 | 说明 |
---|---|---|---|---|
md5 | 方法 | value:any | Buffer | md5加密 |
sha256 | 方法 | value:any | Buffer | sha256加密 |
sha1 | 方法 | value:any | Buffer | sha1加密 |
sha512 | 方法 | value:any | Buffer | sha512加密 |
hmac | 方法 | hash:string,key:Buffer|string,data:Buffer|string | Buffer | hmac加密 |
uuid | 方法 | string | 随机生成uuid | |
ulid | 方法 | string | 随机生成ulid | |
nanoid | 方法 | string | 随机生成nanoid | |
snowflake | 方法 | id?:int | string | 生成snowflakeId |
aes | 属性 | AES | aes加/解密 | |
des | 属性 | DES | des解/密 | |
rsa | 属性 | rsa | rsa对象 | |
pem | 属性 | pem | pem对象 | |
x509 | 属性 | x509 | x509对象 |
md5
语法
crypto.md5(value:any);
参数
- value: 待加密的数据
返回值
- Buffer :加密后的数据
示例
import {crypto} from 'core';
//打印:65a8e27d8879283831b664bd8b7f0ad4
//字节数组的16进制字符串表示
console.log(crypto.md5("Hello, World!").toString("hex"))
sha256
语法
crypto.sha256(value:any);
参数
- value: 待加密的数据
返回值
- Buffer :加密后的数据
import {crypto} from 'core';
//打印:dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
console.log(crypto.sha256("Hello, World!").toString("hex"))
sha1
语法
crypto.sha1(value:any);
参数
- value: 待加密的数据
返回值
- Buffer :加密后的数据
import {crypto} from 'core';
//打印:0a0a9f2a6772942557ab5355d76af442f8f65e01
console.log(crypto.sha1("Hello, World!").toString("hex"))
sha512
语法
crypto.sha512(value:any);
参数
- value: 待加密的数据
返回值
- Buffer :加密后的数据
import {crypto} from 'core';
//打印:374d794a95cdcfd8b35993185fef9ba368f160d8daf432d08ba9f1ed1e5abe6cc69291e0fa2fe0006a52570ef18c19def4e617c33ce52ef0a6e5fbe318cb0387
console.log(crypto.sha512("Hello, World!").toString("hex"))
hmac
HMAC (Hash-based Message Authentication Code) 是一种基于散列函数的消息认证码,用于验证消息的完整性和真实性。HMAC 的核心思想是通过一个加密的密钥和一个标准的哈希函数(如 SHA-256 或 MD5)共同生成一个唯一的签名,从而确保消息在传输过程中没有被篡改
语法
crypto.hmac(hash:string,key:Buffer|string,data:Buffer|string);
参数
- hash: hash算法,支持:md5、sha1、sha256、sha512
- key: 密钥
- data:待加密的数据
返回值
- Buffer :加密后的数据
import {crypto} from 'core';
console.log(crypto.hmac("sha256","key","value"))
uuid
示例
import {crypto} from 'core';
//打印:e91224c4-4ab3-4136-86de-d0ffb7ba4825
console.log(crypto.uuid())
ulid
示例
import {crypto} from 'core';
//打印:01J2Z469YGS8WJJQ4C1N7SPAPA
console.log(crypto.ulid())
nanoid
示例
import {crypto} from 'core';
//打印:7sPFPNtDrWyVzbjx_vwsj
console.log(crypto.nanoid())
snowflake
用于生成雪花id,雪花算法是一种用于生成唯一ID的算法,特别适用于分布式系统.
语法
crypto.snowflake(id?:int)
参数
- id:(可选) 节点ID(必须为整数),默认值:0
节点ID代表了一个服务实例或机器,每个节点都有一个唯一的ID(整数)。这个节点ID用于在分布式系统中区分不同的节点,从而确保生成的ID全局唯一。
示例
import {crypto} from 'core';
//打印: 71772347496927232
console.log(crypto.snowflake());
aes
获取aes加/解密对象
示例
import {crypto} from 'core';
//返回AES对象
let aes = crypto.aes
des
获取des加/解密对象
示例
import {crypto} from 'core';
//返回DES对象
let des = crypto.des
AES/DES
AES/DES的对象属性和方法相同,是一个对称加解密对象
属性与方法
函数 | 类型 | 参数 | 返回值 | 说明 |
---|---|---|---|---|
encrypt | 方法 | config:object | Buffer | 加密 |
decrypt | 方法 | config:object | Buffer | 解密 |
语法
//des加密
crypto.des.encrypt(config:object)
//des解密
crypto.des.decrypt(config:object)
//aes加密
crypto.aes.encrypt(config:object)
//aes解密
crypto.aes.decrypt(config:object)
参数
config对象属性如下:
- data:any 原始数据
- key:string 密钥
- mode:string (可选) 加密模式:ecb、cbc、ctr、ofb、cfb,默认:ecb。不区分大小写
- pading:string (可选) 填充模式:pkcs5、pkcs7、iso10126、none、zero,默认:none。不区分大小写
- iv:string (可选) 偏移量. ecb模式下不需要该参数,其他模式是必选参数
注意事项
data
类型可以是任何类型,但是vino
会将任何类型转换为Buffer
字节数组后再进行加解密。
示例(aes 加密)
import {crypto} from 'core';
let config={
data:"aaaaa",//待加密的数据
key:"aaaabbbbccccdddd",//密钥
mode:"ECB",//(可选) 加密模式:ecb、cbc、ctr、ofb、cfb,默认:ecb。不区分大小写
padding:"PKCS7",//(可选) 填充模式:pkcs5、pkcs7、iso10126、none、zero,默认:none。不区分大小写
}
//打印:sLxU+QDxdx78QJs+zPh9PQ==
console.log(crypto.aes.encrypt(config).toString("base64"));
示例(aes 解密)
import {crypto} from 'core';
//密文的base64字符串
let str="sLxU+QDxdx78QJs+zPh9PQ=="
//解密时需要将base64字符串转为Buffer字节数组,如果不转换,则默认会将字符串按照utf8编码进行转换
let data = str.toBuffer("base64")
let config2={
data:data,//待解密的数据
key:"aaaabbbbccccdddd",//密钥
mode:"ECB",//(可选) 加密模式:ecb、cbc、ctr、ofb、cfb,默认:ecb。不区分大小写
padding:"PKCS7",//(可选) 填充模式:pkcs5、pkcs7、iso10126、none、zero,默认:none。不区分大小写
}
//打印:aaaaa
console.log(crypto.aes.decrypt(config2).toString());
示例(des 加密)
import {crypto} from 'core';
let config={
data:"Hello, vino!",//待加密的数据
key:"12345678",//密钥
mode:"CBC",//(可选) 加密模式:ecb、cbc、ctr、ofb、cfb,默认:ecb。不区分大小写
padding:"PKCS7",//(可选) 填充模式:pkcs5、pkcs7、iso10126、none、zero,默认:none。不区分大小写
iv:"12345678"
}
//打印:bYoPcR6V0Ps1BzJ5TTcr1Q==
console.log(crypto.des.encrypt(config).toString("base64"));
示例(des 解密)
import {crypto} from 'core';
let config={
data:"bYoPcR6V0Ps1BzJ5TTcr1Q==".toBuffer("base64"),//待加密的数据
key:"12345678",//密钥
mode:"CBC",//(可选) 加密模式:ecb、cbc、ctr、ofb、cfb,默认:ecb。不区分大小写
padding:"PKCS7",//(可选) 填充模式:pkcs5、pkcs7、iso10126、none、zero,默认:none。不区分大小写
iv:"12345678"
}
//打印:Hello, vino!
console.log(crypto.des.decrypt(config).toString());
rsa
生成一对 RSA 密钥(公钥和私钥)
函数 | 类型 | 参数 | 返回值 | 说明 |
---|---|---|---|---|
generateKey | 方法 | bits:int | object | 生成密钥对 |
encrypt | 方法 | key:PublicKey,message:Buffer | Buffer | 使用公钥对数据进行加密 |
decrypt | 方法 | key:PrivateKey,ciphertext:Buffer | Buffer | 使用私钥对数据进行解密 |
sign | 方法 | key:PrivateKey,message:Buffer,hash:string | Buffer | 使用私钥对数据进行签名 |
verify | 方法 | key:PublicKey,message:Buffer,hashed:Buffer,hash:string | boolean | 使用公钥对签名进行验证 |
generateKey
生成密钥对
import {crypto} from "core";
//创建长度2048字节的密钥对
let key = crypto.rsa.generatekey(2048)
//获取公钥对象
let publicKey = key.publicKey
//获取私钥对象
let privateKey = key.privateKey
encrypt
加密
import {crypto} from "core";
//创建长度2048字节的密钥对
let key = crypto.rsa.generatekey(2048)
//使用公钥加密
let m1 = crypto.rsa.encrypt(key.publicKey,"Hello, World!")
decrypt
解密
import {crypto} from "core";
//创建长度2048字节的密钥对
let key = crypto.rsa.generatekey(2048)
//使用公钥加密
let m1 = crypto.rsa.encrypt(key.publicKey,"Hello, World!")
//使用私钥解密
let m2 = crypto.rsa.decrypt(key.privateKey,m1)
//打印:Hello, World!
console.log(m2.toString())
sign
签名
import {crypto} from "core";
//创建长度2048字节的密钥对
let key = crypto.rsa.generatekey(2048)
//使用私钥进行签名
let sign = crypto.rsa.sign(key.privateKey,"Hello, World!","sha256")
//打印签名的base64字符串
console.log(sign.toBase64())
verify
验证签名
import {crypto} from "core";
//创建长度2048字节的密钥对
let key = crypto.rsa.generatekey(2048)
//使用私钥进行签名
let sign = crypto.rsa.sign(key.privateKey,"Hello, World!","sha256")
//用公钥对数据和签名进行验证
let verify = crypto.rsa.verify(key.publicKey,"Hello, World!",sign,"sha256")
//true,验证成功
console.log(verify)
x509
x509 是一个标准的公钥基础设施(PKI)协议,它定义了公钥证书的格式和各种操作,例如证书生成、签名、验证、序列化和反序列化。x509 是在 ITU-T X.509 标准中定义的,并且被广泛应用于 SSL/TLS、HTTPS 等安全通信中。
函数 | 类型 | 参数 | 返回值 | 说明 |
---|---|---|---|---|
marshalPKCS1PrivateKey | 方法 | data:PrivateKey | Buffer | 将 RSA 私钥序列化为 PKCS#1 格式的 DER 编码 |
marshalPKCS1PublicKey | 方法 | data:PublicKey | Buffer | 将 RSA 公钥序列化为 PKCS#1 格式的 DER 编码 |
parsePKCS1PrivateKey | 方法 | data:Buffer | PrivateKey | 解析 PKCS#1 格式的 DER 编码 RSA 私钥 |
parsePKCS1PublicKey | 方法 | data:Buffer | PublicKey | 解析 PKCS#1 格式的 DER 编码 RSA 公钥 |
1. marshalPKCS1PrivateKey
将 RSA 私钥序列化为 PKCS#1 格式的 DER 编码
import {crypto} from "core";
let rsa = crypto.rsa(2048)
let buffer = crypto.x509.marshalPKCS1PrivateKey(rsa.privateKey)
2. marshalPKCS1PublicKey
将 RSA 公钥序列化为 PKCS#1 格式的 DER 编码
import {crypto} from "core";
let key = crypto.rsa.generatekey(2048)
let buffer = crypto.x509.marshalPKCS1PublicKey(key.publicKey)
3. parsePKCS1PrivateKey
解析 PKCS#1 格式的 DER 编码 RSA 私钥
import {crypto} from "core";
let key = crypto.rsa.generatekey(2048)
//将私钥对象序列化为buffer对象
let buffer = crypto.x509.marshalPKCS1PrivateKey(key.privateKey)
//将buffer对象反序列化为私钥对象
let privateKey = crypto.x509.parsePKCS1PrivateKey(buffer)
4. parsePKCS1PublicKey
解析 PKCS#1 格式的 DER 编码 RSA 公钥
import {crypto} from "core";
let key = crypto.rsa.generatekey(2048)
//将公钥对象序列化为buffer对象
let buffer = crypto.x509.marshalPKCS1PublicKey(key.publicKey)
//将buffer对象反序列化为公钥对象
let publicKey = crypto.x509.parsePKCS1PublicKey(buffer)
pem
pem格式化
将数据转换为pem格式
import {crypto} from "core";
let key = crypto.rsa.generatekey(2048)
let buffer = crypto.x509.marshalPKCS1PublicKey(key.publicKey)
let config = {
type:"RSA PUBLIC KEY", //类型名称
body:buffer, //公钥数据
}
//返回pem格式的buffer对象
let pemBuffer = crypto.pem.encode(config)
//打印pem格式的文本内容
console.log(pemBuffer.toString())
//将pem格式的buffer对象转换为pem格式的对象
let pem = crypto.pem.decode(pemBuffer)
console.log(pem.type)
console.log(pem.body.toString())
console.log(pem.headers)