Compare commits

...

16 Commits

Author SHA1 Message Date
yutent 6313b9c0a8 添加MIT开源协议 2025-01-03 18:51:24 +08:00
yutent fae1ce2f15 修复声明 2025-01-03 18:46:51 +08:00
yutent a740ad2f73 优化index.d.ts 2025-01-03 18:25:00 +08:00
yutent b25b04efbc 优化`.d.ts`参数声明 2024-12-13 12:07:11 +08:00
yutent 1794ab0470 增加 `.d.ts`, 默认为esm加载 2024-12-12 16:05:44 +08:00
yutent f26091f81c fixed fs 2024-07-17 12:21:49 +08:00
yutent 54a8feb5ca update 2024-03-11 16:50:44 +08:00
yutent 6740bed15b 更新文档 2024-03-11 16:48:18 +08:00
yutent 725d2e1231 优化字符 2023-12-27 10:30:11 +08:00
yutent b29fa3d163 更新readme 2023-12-27 10:28:54 +08:00
yutent ccb17bfd12 3.2.0 2023-12-27 10:27:33 +08:00
yutent 9f891e75f5 更新 2023-12-26 15:53:43 +08:00
yutent 52af19e58e 优化`uuid()`, 增加有序性 2023-10-18 19:20:15 +08:00
yutent 20639ab038 优化uuid, 增加有序特性 2023-06-02 18:53:02 +08:00
yutent 5281159c21 优化引入方式,及uuid算法 2023-02-13 17:19:05 +08:00
yutent 3cc8c53a72 cipher()内部判断Node.js版本, 大于10.5时,改为调用cipheriv() 2022-01-08 16:43:29 +08:00
9 changed files with 498 additions and 186 deletions

21
LICENSE copy Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -2,8 +2,33 @@
> 本模块是对原生的`crypto`模块二次封装的,在使用上更加简单方便。
## 更新日志
+ v3.3.4
- 添加MIT开源协议
+ v3.3.3
- 优化`.d.ts`参数声明
+ v3.3.1
- 优化`.d.ts`参数声明
+ v3.3.0
- 增加 `.d.ts`, 默认为esm加载
+ v3.2.0
- 调整`cipher,decipher,cipheriv,decipheriv`的传参和返回结果, `aes-gcm`等算法,`tag`会拼接在密文后面。
- 增加`crypto`属性返回, 该属性为`原生crypto对象`
- 原`origin`属性标识为`Deprecated`,v4.0之后会直接移除。
- `cipher,cipheriv`, 默认的密钥和向量均为`Buffer.alloc(16)`
+ v3.1.2
- 优化`uuid()`, 增加有序性
+ v3.1.0
- 优化`uuid(),rand()`
- 优化库引用方式
+ v3.0.0
- Node.js 10.0.0之后不再推荐使用`crypto.createCipher()`, 所以 本库的`cipher()`方法, 内部改为调用`cipheriv()`
- Node.js 10.0.0之后不再推荐使用`crypto.createCipher()`, 所以 本库的`cipher()`方法, 内部改为调用`cipheriv()` (Node.js大于10.5.0时, 旧版本的不变)
+ v2.1.0
- 优化`cipher()`等公钥加密方法的`key`和`iv`的默认值为`crypto.scryptSync('', '', 16)`
@ -25,7 +50,8 @@ npm install crypto.js
```js
// 1、 传统的 commonJS引入, 所有的方法都在上面
var {
default: crypto,
origin, // 原生crypto对象
crypto, // 原生crypto对象
uuid,
rand,
md5,
@ -34,6 +60,8 @@ var {
sha1Sign,
sha256,
sha256Sign,
sha512,
sha512Sign,
base64encode,
base64decode
} = require('crypto.js')
@ -41,7 +69,9 @@ var {
// 2、 全新的 ESM 方式
import crypto from 'crypto.js'
import {
import crypto, {
origin, // 原生crypto对象
crypto, // 原生crypto对象
uuid,
rand,
md5,
@ -50,6 +80,8 @@ import {
sha1Sign,
sha256,
sha256Sign,
sha512,
sha512Sign,
base64encode,
base64decode,
} from 'crypto.js'
@ -59,14 +91,20 @@ import {
## 属性
> 其实就一个属性,即 `origin`,即为原生的`crypto`对象,方便在封装的方法中无法满足需求时,可以自行调用原生的`crypto`实现。
### `origin` (Deprecated)
> 即为原生的`crypto`对象,方便在封装的方法中无法满足需求时,可以自行调用原生的`crypto`实现。
### `crypto` (v3.2.0新增)
> 即为原生的`crypto`对象,方便在封装的方法中无法满足需求时,可以自行调用原生的`crypto`实现。
## 常用API方法
> 对使用频率非常高的几种加密/编码进行更加简便的封装。
### rand(len[, onlyNumber])
### rand(len[, forceNum])
- len `<Number>` 需要的字符长度
- onlyNumber `<Boolean>` 返回纯数字字符串 [可选]
- forceNum `<Boolean>` 返回纯数字字符串 [可选]
> 该方法用于生成指定长度的随机字符串`[a-z-A-z0-9]`
@ -224,18 +262,20 @@ crypto.hmac('md5', '123456', 'sdfvkjfhd')
> 在上面的2种算法中加密都是不可逆的也就是说加密后的字符我们是没办法再还原回去了但是有很多场景需要我们对拿到的加密字符还原到明文状态。
> 所以出现了公钥加密这种算法; 而`Node.js`本身给我们提供了4种与公钥加密相关的类`Cipher/Decipher、Sign、Verify`这里只讲前面2个以及它们衍生出来的`Cipheriv/Decipheriv`;
>> Nodejs v10.0之后该方法为Deprecated, 推荐使用 cipheriv()
#### cipher(mode, data[, key, inEncode, outEncode])
- mode `<String>`
- data `<String>` | `<Buffer>`
- key `<String>` 可选, 默认为 `<Buffer d7 2c 87 d0 f0 77 c7 76 6f 29 85 df ab 30 e8 95>`, 即 `crypto.scryptSync('', '', 16)` 的结果
- key `<String>` 可选, 默认为 `<Buffer 0 0 0 ... 0>`, 即 `Buffer.alloc(16)` 的结果
- inEncode '<String>' 可选
- outEncode '<String>' 可选,默认base64
- outEncode '<String>' 可选,默认返回Buffer对象
> `crypto.js v3.x`开始, `cipher()`内部改成调用 `cipheriv()`, 如果有特别原因, 仍然要调用的话, 请使用 `2.x版本`
> `mode`为算法类型,常见的有`aes-128-cbc、aes-128-gcm`等等地,很多,具体有哪些可以通过 `this.crypto.getCiphers()` 来查看。
> 其他的参数与上面的HMAC算法相似; `inEncode`即声明要加密的数据是什么编码的,默认根据要加密的数据进行判断。
>> 需要注意的是, 算法类型为`aes-***-gcm`时, 返回的不是一个字符串, 而是一个对象{ enStr, authTag }, 解密时, 需要提供这个 authTag方可解密
```javascript
// 这里给出一个AES-128-CBC的加密例子
@ -246,12 +286,12 @@ crypto.cipher('aes-128-cbc', '123456', 'abcdefg')
crypto.cipher('aes-128-cbc', '123456', 'abcdefg', 'utf8', 'hex')
// 9aa03d64f87d555f9fc0a95fa6270656
// 要注意gcm算法的结果
crypto.cipher('aes-128-gcm', '123456', 'abcdefg')
// { enStr: 'qmo1a4Jz',
// authTag: <Buffer c4 a0 3e ab e5 34 a0 ea 25 02 f0 91 06 f7 3b dd>
// }
// v3.x 之后, decipher()同理
crypto.cipher('aes-128-cbc', '123456', {key})
// 等价于
crypto.cipheriv('aes-128-cbc', '123456', {key}, EMPTY_IV) // 其中 EMPTY_IV = Buffer.alloc(16)
```
@ -266,6 +306,8 @@ crypto.cipher('aes-128-gcm', '123456', 'abcdefg')
> 这是与上面的`cipher`对应的解密方法;
>> Nodejs v10.0之后该方法为Deprecated, 推荐使用 decipheriv()
```javascript
// 这里不用指定编码默认即为base64
crypto.decipher('aes-128-cbc', 'mqA9ZPh9VV+fwKlfpicGVg==', 'abcdefg')
@ -277,14 +319,8 @@ crypto.decipher('aes-128-cbc', '9aa03d64f87d555f9fc0a95fa6270656', 'abcdefg', 'h
// 要注意gcm算法的结果
// authTag: <Buffer c4 a0 3e ab e5 34 a0 ea 25 02 f0 91 06 f7 3b dd>
crypto.decipher('aes-128-gcm', 'qmo1a4Jz', 'abcdefg', authTag)
// 123456
```
> 至于另外的`cipheriv/decipheriv`这2个方法这里就不细讲了和上面的这2个是同样的用法只是要多1个参数`向量(iv)`
>> **`特别要注意的一点是选择128位的加密算法那key的长度就必须是16位256则是32位依此类推; 算法类型为gcm时,返回的是对象,解密时需要提供authTag `,具体的请看相关文档**
>> **`特别要注意的一点是选择128位的加密算法那key的长度就必须是16位256则是32位依此类推`,具体的请看相关文档**

View File

@ -4,10 +4,11 @@
* @date 2021/08/09 11:59:41
*/
const Es = require('esbuild')
import Es from 'esbuild'
import fs from 'iofs'
Es.build({
entryPoints: ['src/index.mjs'],
entryPoints: ['src/index.js'],
outfile: 'dist/index.mjs',
platform: 'node',
bundle: true,
@ -15,9 +16,11 @@ Es.build({
format: 'esm'
})
Es.build({
entryPoints: ['src/index.mjs'],
entryPoints: ['src/index.js'],
outfile: 'dist/index.js',
platform: 'node',
bundle: true,
minify: true
})
fs.cp('src/index.d.ts', 'dist/index.d.ts')

View File

@ -1,14 +1,15 @@
{
"name": "crypto.js",
"version": "2.1.0",
"type": "module",
"version": "3.3.4",
"description": "原生crypto加密模块的二次封装,简化常用加密函数的使用",
"keywords": [
"md5",
"sha1",
"sha256",
"hmac",
"aes",
"base64",
"fivejs",
"crypto",
"crypto-js",
"crypto.js"
@ -16,16 +17,19 @@
"author": "yutent <yutent.io@gmail.com>",
"repository": {
"type": "git",
"url": "https://github.com/bytedo/crypto.js.git"
"url": "https://git.wkit.fun/bytedo/crypto.js.git"
},
"dependencies": {},
"devDependencies": {},
"license": "MIT",
"main": "dist/index.js",
"files": ["dist/*"],
"types": "dist/index.d.ts",
"files": [
"dist/*"
],
"scripts": {
"start": "node ./build.js"
},
"exports": {
"types": "./dist/index.d.ts",
"require": "./dist/index.js",
"import": "./dist/index.mjs"
}

174
src/helper.js Normal file
View File

@ -0,0 +1,174 @@
import crypto from 'crypto'
const AUTH_MODE = [
'aes-128-gcm',
'aes-192-gcm',
'aes-256-gcm',
'aes-128-ccm',
'aes-192-ccm',
'aes-256-ccm',
'aes-128-ocb',
'aes-192-ocb',
'aes-256-ocb'
]
const VERSION = +process.versions.node.split('.').slice(0, 2).join('.')
const KEY_16 = Buffer.alloc(16)
function format(buff, encode) {
if (encode === void 0 || encode === 'buffer') {
return buff
}
return buff.toString(encode)
}
//
if (!crypto.randomUUID) {
crypto.randomUUID = function () {
let str = crypto.randomBytes(16).toString('hex')
return (
str.slice(0, 8) +
'-' +
str.slice(8, 12) +
'-' +
str.slice(12, 16) +
'-' +
str.slice(16, 20) +
'-' +
str.slice(-12)
)
}
}
if (!crypto.randomInt) {
crypto.randomInt = function (max) {
if (max === void 0) {
throw new TypeError(
'[ERR_INVALID_ARG_TYPE]: The "max" argument must be a safe integer. Received undefined'
)
}
return ~~(Math.random() * max)
}
}
export { crypto }
export const hash = function (mode, data, outEncode) {
let sum = crypto.createHash(mode)
let isBuffer = Buffer.isBuffer(data)
sum.update(data, isBuffer ? 'buffer' : 'utf8')
return sum.digest(outEncode || 'hex')
}
export const hmac = function (mode, data, key, outEncode) {
key = key || ''
let sum = crypto.createHmac(mode, key)
let isBuffer = Buffer.isBuffer(data)
sum.update(data, isBuffer ? 'buffer' : 'utf8')
return sum.digest(outEncode || 'hex')
}
export const cipher = function (
mode,
data,
key = KEY_16,
inEncode = 'utf8',
outEncode
) {
// 10.0.0之后, createCipher方法不推荐使用了
if (VERSION >= 10.5) {
return cipheriv(mode, data, key, KEY_16, inEncode, outEncode)
}
let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'buffer' : inEncode
let _cipher = crypto.createCipher(mode, key)
let buff = _cipher.update(data, inEncode)
buff = Buffer.concat([buff, _cipher.final()])
if (AUTH_MODE.indexOf(mode) > -1) {
buff = Buffer.concat([buff, _cipher.getAuthTag()])
}
return format(buff, outEncode)
}
export const decipher = function (
mode,
data,
key = KEY_16,
inEncode = 'base64',
outEncode = 'utf8'
) {
// 10.0.0之后, createCipher方法不推荐使用了
if (VERSION >= 10.5) {
return decipheriv(mode, data, key, KEY_16, inEncode, outEncode)
}
let isBuffer = Buffer.isBuffer(data)
if (!isBuffer) {
data = Buffer.from(data, inEncode)
}
inEncode = 'buffer'
let _decipher = crypto.createDecipher(mode, key)
if (AUTH_MODE.indexOf(mode) > -1) {
let tag = data.slice(-16)
data = data.slice(0, -16)
_decipher.setAuthTag(tag)
}
let buff = _decipher.update(data, inEncode)
buff = Buffer.concat([buff, _decipher.final()])
return format(buff, outEncode)
}
export const cipheriv = function (
mode,
data,
key = KEY_16,
iv = KEY_16,
inEncode = 'utf8',
outEncode
) {
let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'buffer' : inEncode
let _cipher = crypto.createCipheriv(mode, key, iv)
let buff = _cipher.update(data, inEncode)
buff = Buffer.concat([buff, _cipher.final()])
if (AUTH_MODE.indexOf(mode) > -1) {
buff = Buffer.concat([buff, _cipher.getAuthTag()])
}
return format(buff, outEncode)
}
export const decipheriv = function (
mode,
data,
key = KEY_16,
iv = KEY_16,
inEncode = 'base64',
outEncode = 'utf8'
) {
let isBuffer = Buffer.isBuffer(data)
if (!isBuffer) {
data = Buffer.from(data, inEncode)
}
inEncode = 'buffer'
let _decipher = crypto.createDecipheriv(mode, key, iv)
if (AUTH_MODE.indexOf(mode) > -1) {
let tag = data.slice(-16)
data = data.slice(0, -16)
_decipher.setAuthTag(tag)
}
let buff = _decipher.update(data, inEncode)
buff = Buffer.concat([buff, _decipher.final()])
return format(buff, outEncode)
}

View File

@ -1,112 +0,0 @@
import crypto from 'crypto'
const AUTH_MODE = [
'aes-128-gcm',
'aes-192-gcm',
'aes-256-gcm',
'aes-128-ccm',
'aes-192-ccm',
'aes-256-ccm',
'aes-128-ocb',
'aes-192-ocb',
'aes-256-ocb'
]
// const VERSION = +process.versions.node
// .split('.')
// .slice(0, 2)
// .join('.')
// <Buffer d7 2c 87 d0 f0 77 c7 76 6f 29 85 df ab 30 e8 95>
const EMPTY_KEY = crypto.scryptSync
? crypto.scryptSync('', '', 16)
: Buffer.from(
'0xd7 0x2c 0x87 0xd0 0xf0 0x77 0xc7 0x76 0x6f 0x29 0x85 0xdf 0xab 0x30 0xe8 0x95'.split(' ')
)
export default {
origin: crypto,
hash(mode, data, outEncode) {
let sum = crypto.createHash(mode)
let isBuffer = Buffer.isBuffer(data)
sum.update(data, isBuffer ? 'binary' : 'utf8')
return sum.digest(outEncode || 'hex')
},
hmac(mode, data, key, outEncode) {
key = key || ''
let sum = crypto.createHmac(mode, key)
let isBuffer = Buffer.isBuffer(data)
sum.update(data, isBuffer ? 'binary' : 'utf8')
return sum.digest(outEncode || 'hex')
},
cipher(mode, data, key = EMPTY_KEY, inEncode, outEncode) {
// 10.0.0之后, createCipher方法不推荐使用了
// if (VERSION >= 10.5) {
// return this.cipheriv(mode, data, key, EMPTY_KEY, inEncode, outEncode)
// }
let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'utf8'
outEncode = outEncode || 'base64'
let cipher = crypto.createCipher(mode, key)
let enStr = cipher.update(data, inEncode, outEncode)
enStr += cipher.final(outEncode)
if (AUTH_MODE.indexOf(mode) > -1) {
let authTag = cipher.getAuthTag()
return { enStr, authTag }
}
return enStr
},
decipher(mode, data, key = EMPTY_KEY, tag, inEncode, outEncode) {
// 10.0.0之后, createCipher方法不推荐使用了
// if (VERSION >= 10.5) {
// return this.decipheriv(mode, data, key, EMPTY_KEY, tag, inEncode, outEncode)
// }
let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'base64'
outEncode = outEncode || 'utf8'
let cd = crypto.createDecipher(mode, key)
if (AUTH_MODE.indexOf(mode) > -1) {
cd.setAuthTag(tag)
}
let deStr = cd.update(data, inEncode, outEncode)
deStr += cd.final(outEncode)
return deStr
},
cipheriv(mode, data, key = EMPTY_KEY, iv = EMPTY_KEY, inEncode, outEncode) {
let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'utf8'
outEncode = outEncode || 'base64'
let cciv = crypto.createCipheriv(mode, key, iv)
let enStr = cciv.update(data, inEncode, outEncode)
enStr += cciv.final(outEncode)
if (AUTH_MODE.indexOf(mode) > -1) {
let authTag = cciv.getAuthTag()
return { enStr, authTag }
}
return enStr
},
decipheriv(mode, data, key = EMPTY_KEY, iv = EMPTY_KEY, tag, inEncode, outEncode) {
let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'base64'
outEncode = outEncode || 'utf8'
let dcpiv = crypto.createDecipheriv(mode, key, iv)
if (AUTH_MODE.indexOf(mode) > -1) {
dcpiv.setAuthTag(tag)
}
let deStr = dcpiv.update(data, inEncode, outEncode)
deStr += dcpiv.final(outEncode)
return deStr
}
}

96
src/index.d.ts vendored Normal file
View File

@ -0,0 +1,96 @@
/**
* {}
* @author yutent<yutent.io@gmail.com>
* @date 2024/12/12 15:41:25
*/
declare module 'crypto.js' {
import crypto from 'node:crypto'
// 原生 crypto 模块
export { crypto }
/**
* @deprecated Use `crypto` instead.
*/
export const origin: typeof crypto
// 随机数生成
export function rand(len: number, forceNum?: boolean): string
// 生成唯一 uuid
export function uuid(pipe?: string): string
export function base64encode(str: string, urlFriendly?: boolean): string
export function base64decode(str: string, urlFriendly?: boolean): string
export function md5(data: string, encode?: string): string | Buffer
export function md5Sign(path: string, encode?: string): string | Buffer
export function sha1(data: string, encode?: string): string | Buffer
export function sha1Sign(path: string, encode?: string): string | Buffer
export function sha256(data: string, encode?: string): string | Buffer
export function sha256Sign(path: string, encode?: string): string | Buffer
export function sha512(data: string, encode?: string): string | Buffer
export function sha512Sign(path: string, encode?: string): string | Buffer
//
export function hash(
mode: string,
data: string | Buffer,
outEncode?: string
): string | Buffer
//
export function hmac(
mode: string,
data: string | Buffer,
key: string | Buffer,
outEncode?: string
): string | Buffer
//
export function cipher(
mode: string,
data: string | Buffer,
key: string | Buffer,
inEncode?: string,
outEncode?: string
): string | Buffer
//
export function decipher(
mode: string,
data: string | Buffer,
key: string | Buffer,
inEncode?: string,
outEncode?: string
): string | Buffer
//
export function cipheriv(
mode: string,
data: string | Buffer,
key: string | Buffer,
iv: string | Buffer,
inEncode?: string,
outEncode?: string
): string | Buffer
//
export function decipheriv(
mode: string,
data: string | Buffer,
key: string | Buffer,
iv: string | Buffer,
inEncode?: string,
outEncode?: string
): string | Buffer
}

View File

@ -6,27 +6,36 @@
import os from 'os'
import fs from 'fs'
import Helper from './helper.mjs'
import {
crypto,
hash,
hmac,
cipher,
decipher,
cipheriv,
decipheriv
} from './helper.js'
const MAC = (function(ns) {
const MAC = (function (ns) {
for (let k in ns) {
let _ = ns[k].pop()
if (_.mac !== '00:00:00:00:00:00') {
return _.mac
if (k === 'lo') {
continue
}
let _ = ns[k].pop()
return _.mac.replace(/:/g, '').slice(-4)
}
return process.pid.toString(16) + process.ppid.toString(16)
return Math.random().toString(16).slice(-4)
})(os.networkInterfaces())
var __inc__ = 1024
let __inc__ = 4096
/**
* [base64encode base64编码]
* @param {Str/Num/Buffer} str [要编码的字符串]
* @param {bool} urlFriendly [是否对URL友好默认否是则会把+转成-/转成_]
* @param {bool} urlFriendly [是否对URL友好, 默认否, 是则会把+转成-, /_]
*/
export function base64encode(str, urlFriendly) {
var buf, str64
let buf, str64
if (Buffer.isBuffer(str)) {
buf = str
@ -37,10 +46,7 @@ export function base64encode(str, urlFriendly) {
str64 = buf.toString('base64')
if (urlFriendly) {
return str64
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '')
return str64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '')
}
return str64
}
@ -65,7 +71,7 @@ export function base64decode(str, urlFriendly) {
* @param {[type]} len [要得到的字符串长度]
* @param {[type]} forceNum [是否强制返回纯数字]
*/
export function rand(len, forceNum) {
export function rand(len = 0, forceNum = false) {
let str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789'
if (forceNum) {
str = '0123456789'
@ -73,25 +79,24 @@ export function rand(len, forceNum) {
let max = str.length
let tmp = ''
for (let i = 0; i < len; i++) {
let r = (Math.random() * max) >> 0
tmp += str[r]
tmp += str[crypto.randomInt(max)]
}
return tmp
}
// 返回一个如下格式的 xxxxxxxx-xxxx-xxxx-xxxxxxxx 的唯一ID
export function uuid(pipe = '-') {
var rand = Helper.origin.randomBytes(8).toString('hex')
var now = (~~(Date.now() / 1000)).toString(16)
var str
let str = crypto.randomUUID()
let now = (~~(Date.now() / 1000)).toString(16)
__inc__++
if (__inc__ > 65535) {
__inc__ = 1024
__inc__ = 4096
}
str = md5(MAC + rand + __inc__)
return now + pipe + str.slice(0, 4) + pipe + str.slice(4, 8) + pipe + str.slice(-8)
str = __inc__.toString(16) + str
__inc__++
return now + pipe + MAC + pipe + str.slice(0, 4) + pipe + str.slice(-8)
}
/**
@ -105,7 +110,7 @@ export function md5(str, encode) {
}
if (typeof str === 'string' || Buffer.isBuffer(str)) {
return Helper.hash('md5', str, encode)
return hash('md5', str, encode)
}
return str
@ -114,13 +119,15 @@ export function md5(str, encode) {
/**
* [md5Sign 获取文件的md5签名]
* @param {Str} file [文件路径]
* @param {Str} encode [hex/base64]
*/
export function md5Sign(file) {
if (fs.accessSync(file, fs.constants.R_OK)) {
var buf = fs.readFileSync(file)
return Helper.hash('md5', buf)
export function md5Sign(file, encode) {
try {
let buf = fs.readFileSync(file)
return hash('md5', buf, encode)
} catch (e) {
return null
}
return null
}
/**
@ -133,7 +140,7 @@ export function sha1(str, encode) {
str += ''
}
if (typeof str === 'string' || Buffer.isBuffer(str)) {
return Helper.hash('sha1', str, encode)
return hash('sha1', str, encode)
}
return str
@ -143,25 +150,26 @@ export function sha1(str, encode) {
* [sha1Sign 获取文件的sha1签名]
* @param {Str} file [文件路径]
*/
export function sha1Sign(file) {
if (fs.accessSync(file, fs.constants.R_OK)) {
var buf = fs.readFileSync(file)
return Helper.hash('sha1', buf)
export function sha1Sign(file, encode) {
try {
let buf = fs.readFileSync(file)
return hash('sha1', buf, encode)
} catch (e) {
return null
}
return null
}
/**
* [sha256 sha256加密]
* @param {Str/Num} str [要加密的字符串]
* @param {Str} encoding [hex/base64]
* @param {Str} encode [hex/base64]
*/
export function sha256(str, encoding) {
export function sha256(str, encode) {
if (typeof str === 'number') {
str += ''
}
if (typeof str === 'string' || Buffer.isBuffer(str)) {
return Helper.hash('sha256', str, encoding)
return hash('sha256', str, encode)
}
return str
@ -171,12 +179,74 @@ export function sha256(str, encoding) {
* [sha256Sign 获取文件的sha256签名]
* @param {Str} file [文件路径]
*/
export function sha256Sign(file) {
if (fs.accessSync(file, fs.constants.R_OK)) {
var buf = fs.readFileSync(file)
return Helper.hash('sha256', buf)
export function sha256Sign(file, encode) {
try {
let buf = fs.readFileSync(file)
return hash('sha256', buf, encode)
} catch (e) {
return null
}
return null
}
export default Helper
/**
* [sha512 sha512加密]
* @param {Str/Num} str [要加密的字符串]
* @param {Str} encode [hex/base64]
*/
export function sha512(str, encode) {
if (typeof str === 'number') {
str += ''
}
if (typeof str === 'string' || Buffer.isBuffer(str)) {
return hash('sha512', str, encode)
}
return str
}
/**
* [sha512Sign 获取文件的sha512签名]
* @param {Str} file [文件路径]
*/
export function sha512Sign(file, encode) {
try {
let buf = fs.readFileSync(file)
return hash('sha512', buf, encode)
} catch (e) {
return null
}
}
export {
crypto,
crypto as origin,
hash,
hmac,
cipher,
decipher,
cipheriv,
decipheriv
}
export default {
base64encode,
base64decode,
rand,
uuid,
md5,
md5Sign,
sha1,
sha1Sign,
sha256,
sha256Sign,
sha512,
sha512Sign,
crypto,
origin: crypto,
hash,
hmac,
cipher,
decipher,
cipheriv,
decipheriv
}

20
test/test.js Normal file
View File

@ -0,0 +1,20 @@
import { crypto, cipher, cipheriv, decipher, decipheriv } from '../src/index.js'
let algorithm = 'aes-128-cbc'
let data = 'abcd'
let key = Buffer.alloc(16)
let key2 = Buffer.alloc(32)
let iv = Buffer.alloc(16)
let encode = 'base64'
// console.log(crypto.getCiphers())
let output1 = cipher(algorithm, data, key, 'utf8', encode)
let output2 = cipheriv(algorithm, data, key, iv)
console.log(output1)
console.log(output2.toString(encode))
console.log(decipher(algorithm, output1, key))
console.log(decipheriv(algorithm, output2, key, iv))