更新readme

master
yutent 2022-01-08 16:00:36 +08:00
parent 7bbec9afbf
commit 83d3f04b44
4 changed files with 68 additions and 40 deletions

View File

@ -1,6 +1,16 @@
# 加密工具(Crypto) # 加密工具(Crypto)
> 本模块是对原生的`crypto`模块二次封装的,在使用上更加简单方便。 > 本模块是对原生的`crypto`模块二次封装的,在使用上更加简单方便。
## 更新日志
+ v3.0.0
- Node.js 10.0.0之后不再推荐使用`crypto.createCipher()`, 所以 本库的`cipher()`方法, 内部改为调用`cipheriv()`
+ v2.1.0
- 优化`cipher()`等公钥加密方法的`key`和`iv`的默认值为`crypto.scryptSync('', '', 16)`
- 使用ESBuild进行打包。
+ v2.0.5
- 优化`uuid()`的实现。
## 安装 ## 安装
@ -14,7 +24,19 @@ npm install crypto.js
```js ```js
// 1、 传统的 commonJS引入, 所有的方法都在上面 // 1、 传统的 commonJS引入, 所有的方法都在上面
var crypto = require('crypto.js') var {
default: crypto,
uuid,
rand,
md5,
md5Sign,
sha1,
sha1Sign,
sha256,
sha256Sign,
base64encode,
base64decode
} = require('crypto.js')
// 2、 全新的 ESM 方式 // 2、 全新的 ESM 方式
@ -49,11 +71,11 @@ import {
> 该方法用于生成指定长度的随机字符串`[a-z-A-z0-9]` > 该方法用于生成指定长度的随机字符串`[a-z-A-z0-9]`
```javascript ```javascript
let crypto = require('crypto.js') let { rand } = require('crypto.js')
crypto.rand(6) // ddjF7d rand(6) // ddjF7d
crypto.rand(16) // 4sf7dJH6tGHDjhdf rand(16) // 4sf7dJH6tGHDjhdf
crypto.rand(6, true) // 439875 rand(6, true) // 439875
crypto.rand(10, true) // 3458765234 rand(10, true) // 3458765234
``` ```
### uuid() ### uuid()
@ -62,8 +84,8 @@ crypto.rand(10, true) // 3458765234
>> 2、每秒可生成20万个ID(测试机器: Intel i5-8500B@3.00GHz 16G内存) >> 2、每秒可生成20万个ID(测试机器: Intel i5-8500B@3.00GHz 16G内存)
```javascript ```javascript
let crypto = require('crypto.js') let { uuid } = require('crypto.js')
crypto.uuid() // 076d029f-4927-ec5f-5b06e35e uuid() // 076d029f-4927-ec5f-5b06e35e
``` ```
@ -76,10 +98,10 @@ crypto.uuid() // 076d029f-4927-ec5f-5b06e35e
> 这方法,应该没有人不知道是做什么的了,`encode`是要返回的字符串编码,默认为`hex` 可选`base64` 不过有这需求的人可能也许大概...很少吧。 > 这方法,应该没有人不知道是做什么的了,`encode`是要返回的字符串编码,默认为`hex` 可选`base64` 不过有这需求的人可能也许大概...很少吧。
```javascript ```javascript
crypto.md5(123456) // e10adc3949ba59abbe56e057f20f883e md5(123456) // e10adc3949ba59abbe56e057f20f883e
crypto.md5('123456') // e10adc3949ba59abbe56e057f20f883e md5('123456') // e10adc3949ba59abbe56e057f20f883e
crypto.md5('hello world') // 5eb63bbbe01eeed093cb22bb8f5acdc3 md5('hello world') // 5eb63bbbe01eeed093cb22bb8f5acdc3
crypto.md5('hello world', 'base64') // XrY7u+Ae7tCTyyK7j1rNww== md5('hello world', 'base64') // XrY7u+Ae7tCTyyK7j1rNww==
``` ```
@ -89,7 +111,7 @@ crypto.md5('hello world', 'base64') // XrY7u+Ae7tCTyyK7j1rNww==
> 该方法用于计算文件的md5签名`file`即为文件的路径。 > 该方法用于计算文件的md5签名`file`即为文件的路径。
```javascript ```javascript
crypto.md5Sign('xx.jpg') md5Sign('xx.jpg')
``` ```
@ -100,10 +122,10 @@ crypto.md5Sign('xx.jpg')
> 这方法也应该没有人不知道是做什么的了,`encode`是要返回的字符串编码,默认为`hex` 可选`base64` 不过有这需求的人可能也许大概...很少吧。 > 这方法也应该没有人不知道是做什么的了,`encode`是要返回的字符串编码,默认为`hex` 可选`base64` 不过有这需求的人可能也许大概...很少吧。
```javascript ```javascript
crypto.sha1(123456) // 7c4a8d09ca3762af61e59520943dc26494f8941b sha1(123456) // 7c4a8d09ca3762af61e59520943dc26494f8941b
crypto.sha1('123456') // 7c4a8d09ca3762af61e59520943dc26494f8941b sha1('123456') // 7c4a8d09ca3762af61e59520943dc26494f8941b
crypto.sha1('hello world') // 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed sha1('hello world') // 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
crypto.sha1('hello world', 'base64') // Kq5sNclPz7QV2+lfQIuc6R7oRu0= sha1('hello world', 'base64') // Kq5sNclPz7QV2+lfQIuc6R7oRu0=
``` ```
@ -113,7 +135,7 @@ crypto.sha1('hello world', 'base64') // Kq5sNclPz7QV2+lfQIuc6R7oRu0=
> 该方法用于计算文件的sha1签名`file`即为文件的路径。 > 该方法用于计算文件的sha1签名`file`即为文件的路径。
```javascript ```javascript
crypto.sha1Sign('xx.jpg') sha1Sign('xx.jpg')
``` ```
@ -139,7 +161,7 @@ crypto.sha1Sign('xx.jpg')
> 这是用来进行base64编码的本身没啥好说。主要是第2个参数是指编码的结果是否对URL友好默认为否; 如果为true则会把+转成-/转成_ (遵循RFC4648标准)。 > 这是用来进行base64编码的本身没啥好说。主要是第2个参数是指编码的结果是否对URL友好默认为否; 如果为true则会把+转成-/转成_ (遵循RFC4648标准)。
```javascript ```javascript
crypto.base64encode('hello world') //aGVsbG8gd29ybGQ= base64encode('hello world') //aGVsbG8gd29ybGQ=
``` ```
@ -152,7 +174,7 @@ crypto.base64encode('hello world') //aGVsbG8gd29ybGQ=
> base64解码, 返回Buffer对象。同样`urlFriendly`是指要解码的字符串之前是否采用了URL友好处理默认否。 > base64解码, 返回Buffer对象。同样`urlFriendly`是指要解码的字符串之前是否采用了URL友好处理默认否。
```javascript ```javascript
crypto.base64decode('aGVsbG8gd29ybGQ=')// .toString('utf-8') === hello world base64decode('aGVsbG8gd29ybGQ=')// .toString('utf-8') === hello world
``` ```
@ -175,6 +197,8 @@ crypto.base64decode('aGVsbG8gd29ybGQ=')// .toString('utf-8') === hello world
```javascript ```javascript
crypto.hash('md5', '123456') //e10adc3949ba59abbe56e057f20f883e crypto.hash('md5', '123456') //e10adc3949ba59abbe56e057f20f883e
// 等价于
md5('123456')
``` ```
@ -203,10 +227,12 @@ crypto.hmac('md5', '123456', 'sdfvkjfhd')
#### cipher(mode, data[, key, inEncode, outEncode]) #### cipher(mode, data[, key, inEncode, outEncode])
- mode `<String>` - mode `<String>`
- data `<String>` | `<Buffer>` - data `<String>` | `<Buffer>`
- key `<String>` 可选 - key `<String>` 可选, 默认为 `<Buffer d7 2c 87 d0 f0 77 c7 76 6f 29 85 df ab 30 e8 95>`, 即 `crypto.scryptSync('', '', 16)` 的结果
- inEncode '<String>' 可选 - inEncode '<String>' 可选
- outEncode '<String>' 可选默认base64 - outEncode '<String>' 可选默认base64
> Node.js v10.0.0 之后, `crypto.createDecipher()`方法开始不推荐使用。所以, 在 `crypto.js v3.x`开始, `cipher()`内部改成调用 `cipheriv()`, 如果有特别原因, 仍然要调用的话, 请使用 `2.x版本`
> `mode`为算法类型,常见的有`aes-128-cbc、aes-128-gcm`等等地,很多,具体有哪些可以通过 `this.crypto.getCiphers()` 来查看。 > `mode`为算法类型,常见的有`aes-128-cbc、aes-128-gcm`等等地,很多,具体有哪些可以通过 `this.crypto.getCiphers()` 来查看。
> 其他的参数与上面的HMAC算法相似; `inEncode`即声明要加密的数据是什么编码的,默认根据要加密的数据进行判断。 > 其他的参数与上面的HMAC算法相似; `inEncode`即声明要加密的数据是什么编码的,默认根据要加密的数据进行判断。
>> 需要注意的是, 算法类型为`aes-***-gcm`时, 返回的不是一个字符串, 而是一个对象{ enStr, authTag }, 解密时, 需要提供这个 authTag方可解密 >> 需要注意的是, 算法类型为`aes-***-gcm`时, 返回的不是一个字符串, 而是一个对象{ enStr, authTag }, 解密时, 需要提供这个 authTag方可解密

View File

@ -19,6 +19,5 @@ Es.build({
outfile: 'dist/index.js', outfile: 'dist/index.js',
platform: 'node', platform: 'node',
bundle: true, bundle: true,
minify: true, minify: true
format: 'cjs'
}) })

View File

@ -11,12 +11,17 @@ const AUTH_MODE = [
'aes-192-ocb', 'aes-192-ocb',
'aes-256-ocb' 'aes-256-ocb'
] ]
const VERSION = +process.versions.node // const VERSION = +process.versions.node
.split('.') // .split('.')
.slice(0, 2) // .slice(0, 2)
.join('.') // .join('.')
const EMPTY_KEY = crypto.scryptSync('', '', 16) // <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 { export default {
origin: crypto, origin: crypto,
@ -40,9 +45,9 @@ export default {
cipher(mode, data, key = EMPTY_KEY, inEncode, outEncode) { cipher(mode, data, key = EMPTY_KEY, inEncode, outEncode) {
// 10.0.0之后, createCipher方法不推荐使用了 // 10.0.0之后, createCipher方法不推荐使用了
if (VERSION >= 10.5) { // if (VERSION >= 10.5) {
return this.cipheriv(mode, data, key, EMPTY_KEY, inEncode, outEncode) // return this.cipheriv(mode, data, key, EMPTY_KEY, inEncode, outEncode)
} // }
let isBuffer = Buffer.isBuffer(data) let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'utf8' inEncode = isBuffer ? 'binary' : inEncode || 'utf8'
outEncode = outEncode || 'base64' outEncode = outEncode || 'base64'
@ -59,9 +64,9 @@ export default {
decipher(mode, data, key = EMPTY_KEY, tag, inEncode, outEncode) { decipher(mode, data, key = EMPTY_KEY, tag, inEncode, outEncode) {
// 10.0.0之后, createCipher方法不推荐使用了 // 10.0.0之后, createCipher方法不推荐使用了
if (VERSION >= 10.5) { // if (VERSION >= 10.5) {
return this.decipheriv(mode, data, key, EMPTY_KEY, tag, inEncode, outEncode) // return this.decipheriv(mode, data, key, EMPTY_KEY, tag, inEncode, outEncode)
} // }
let isBuffer = Buffer.isBuffer(data) let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'base64' inEncode = isBuffer ? 'binary' : inEncode || 'base64'
@ -76,7 +81,7 @@ export default {
return deStr return deStr
}, },
cipheriv(mode, data, key = EMPTY_KEY, iv = null, inEncode, outEncode) { cipheriv(mode, data, key = EMPTY_KEY, iv = EMPTY_KEY, inEncode, outEncode) {
let isBuffer = Buffer.isBuffer(data) let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'utf8' inEncode = isBuffer ? 'binary' : inEncode || 'utf8'
outEncode = outEncode || 'base64' outEncode = outEncode || 'base64'
@ -91,7 +96,7 @@ export default {
return enStr return enStr
}, },
decipheriv(mode, data, key = EMPTY_KEY, iv = null, tag, inEncode, outEncode) { decipheriv(mode, data, key = EMPTY_KEY, iv = EMPTY_KEY, tag, inEncode, outEncode) {
let isBuffer = Buffer.isBuffer(data) let isBuffer = Buffer.isBuffer(data)
inEncode = isBuffer ? 'binary' : inEncode || 'base64' inEncode = isBuffer ? 'binary' : inEncode || 'base64'
outEncode = outEncode || 'utf8' outEncode = outEncode || 'utf8'

View File

@ -6,7 +6,7 @@
import os from 'os' import os from 'os'
import fs from 'fs' import fs from 'fs'
import Helper from './lib/helper.mjs' import Helper from './helper.mjs'
const MAC = (function(ns) { const MAC = (function(ns) {
for (let k in ns) { for (let k in ns) {
@ -91,9 +91,7 @@ export function uuid(pipe = '-') {
} }
str = md5(MAC + rand + __inc__) str = md5(MAC + rand + __inc__)
return ( return now + pipe + str.slice(0, 4) + pipe + str.slice(4, 8) + pipe + str.slice(-8)
now + pipe + str.slice(0, 4) + pipe + str.slice(4, 8) + pipe + str.slice(-8)
)
} }
/** /**