@pangza/encrypt 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/AESUtil.d.ts +9 -0
- package/dist/AESUtil.d.ts.map +1 -0
- package/dist/AESUtil.js +40 -0
- package/dist/AESUtil.js.map +1 -0
- package/dist/DynamicAesKeyManager.d.ts +12 -0
- package/dist/DynamicAesKeyManager.d.ts.map +1 -0
- package/dist/DynamicAesKeyManager.js +49 -0
- package/dist/DynamicAesKeyManager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -4
package/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @pangza/encrypt
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
AES 等加密
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AES 加解密(ECB + PKCS7,对齐 Java AESUtil / CryptoJS)
|
|
3
|
+
* key 为 16 字节 UTF-8 字符串(非 Base64)
|
|
4
|
+
*/
|
|
5
|
+
export declare const AESUtil: {
|
|
6
|
+
encrypt(plainText: string, key: string): string;
|
|
7
|
+
decrypt(cipherText: string, key: string): string;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=AESUtil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AESUtil.d.ts","sourceRoot":"","sources":["../src/AESUtil.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,OAAO;uBACC,MAAM,OAAO,MAAM,GAAG,MAAM;wBAc3B,MAAM,OAAO,MAAM,GAAG,MAAM;CAajD,CAAC"}
|
package/dist/AESUtil.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AESUtil = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
/**
|
|
9
|
+
* AES 加解密(ECB + PKCS7,对齐 Java AESUtil / CryptoJS)
|
|
10
|
+
* key 为 16 字节 UTF-8 字符串(非 Base64)
|
|
11
|
+
*/
|
|
12
|
+
exports.AESUtil = {
|
|
13
|
+
encrypt(plainText, key) {
|
|
14
|
+
const keyBuf = Buffer.from(key, "utf8");
|
|
15
|
+
if (keyBuf.length !== 16) {
|
|
16
|
+
throw new Error("AES 密钥长度必须为 16 字节");
|
|
17
|
+
}
|
|
18
|
+
const cipher = crypto_1.default.createCipheriv("aes-128-ecb", keyBuf, null);
|
|
19
|
+
cipher.setAutoPadding(true);
|
|
20
|
+
const encrypted = Buffer.concat([
|
|
21
|
+
cipher.update(Buffer.from(plainText, "utf8")),
|
|
22
|
+
cipher.final(),
|
|
23
|
+
]);
|
|
24
|
+
return encrypted.toString("base64");
|
|
25
|
+
},
|
|
26
|
+
decrypt(cipherText, key) {
|
|
27
|
+
const keyBuf = Buffer.from(key, "utf8");
|
|
28
|
+
if (keyBuf.length !== 16) {
|
|
29
|
+
throw new Error("AES 密钥长度必须为 16 字节");
|
|
30
|
+
}
|
|
31
|
+
const decipher = crypto_1.default.createDecipheriv("aes-128-ecb", keyBuf, null);
|
|
32
|
+
decipher.setAutoPadding(true);
|
|
33
|
+
const decrypted = Buffer.concat([
|
|
34
|
+
decipher.update(Buffer.from(cipherText, "base64")),
|
|
35
|
+
decipher.final(),
|
|
36
|
+
]);
|
|
37
|
+
return decrypted.toString("utf8");
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=AESUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AESUtil.js","sourceRoot":"","sources":["../src/AESUtil.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B;;;GAGG;AACU,QAAA,OAAO,GAAG;IACrB,OAAO,CAAC,SAAiB,EAAE,GAAW;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,MAAM,GAAG,gBAAM,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,EAAE;SACf,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,UAAkB,EAAE,GAAW;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtE,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAClD,QAAQ,CAAC,KAAK,EAAE;SACjB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 动态 AES 会话密钥(对齐 Java DynamicAesKeyManager)
|
|
3
|
+
*/
|
|
4
|
+
export declare const DynamicAesKeyManager: {
|
|
5
|
+
generateDynamicKey(): {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
aesKey: string;
|
|
8
|
+
};
|
|
9
|
+
getAesKeyBySessionId(sessionId: string): string;
|
|
10
|
+
removeKey(sessionId: string): void;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=DynamicAesKeyManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicAesKeyManager.d.ts","sourceRoot":"","sources":["../src/DynamicAesKeyManager.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,eAAO,MAAM,oBAAoB;0BACT;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;oCAkB3B,MAAM,GAAG,MAAM;yBAW1B,MAAM,GAAG,IAAI;CAOnC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DynamicAesKeyManager = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const KEY_EXPIRE_MS = 300000;
|
|
9
|
+
const AES_KEY_LENGTH = 16;
|
|
10
|
+
const keyMap = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* 动态 AES 会话密钥(对齐 Java DynamicAesKeyManager)
|
|
13
|
+
*/
|
|
14
|
+
exports.DynamicAesKeyManager = {
|
|
15
|
+
generateDynamicKey() {
|
|
16
|
+
const aesKey = crypto_1.default.randomUUID().replace(/-/g, "").slice(0, AES_KEY_LENGTH);
|
|
17
|
+
if (aesKey.length !== AES_KEY_LENGTH) {
|
|
18
|
+
throw new Error(`生成的AES密钥长度不符合要求:${aesKey.length}`);
|
|
19
|
+
}
|
|
20
|
+
const sessionId = crypto_1.default.randomUUID();
|
|
21
|
+
const timer = setTimeout(() => {
|
|
22
|
+
keyMap.delete(sessionId);
|
|
23
|
+
}, KEY_EXPIRE_MS);
|
|
24
|
+
timer.unref?.();
|
|
25
|
+
keyMap.set(sessionId, { key: aesKey, timer });
|
|
26
|
+
return {
|
|
27
|
+
sessionId,
|
|
28
|
+
aesKey: Buffer.from(aesKey, "utf8").toString("base64"),
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
getAesKeyBySessionId(sessionId) {
|
|
32
|
+
const entry = keyMap.get(sessionId);
|
|
33
|
+
if (!entry) {
|
|
34
|
+
throw new Error("密钥已过期或不存在");
|
|
35
|
+
}
|
|
36
|
+
if (entry.key.length !== AES_KEY_LENGTH) {
|
|
37
|
+
throw new Error("存储的AES密钥长度异常");
|
|
38
|
+
}
|
|
39
|
+
return entry.key;
|
|
40
|
+
},
|
|
41
|
+
removeKey(sessionId) {
|
|
42
|
+
const entry = keyMap.get(sessionId);
|
|
43
|
+
if (entry) {
|
|
44
|
+
clearTimeout(entry.timer);
|
|
45
|
+
keyMap.delete(sessionId);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=DynamicAesKeyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicAesKeyManager.js","sourceRoot":"","sources":["../src/DynamicAesKeyManager.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B,MAAM,aAAa,GAAG,MAAO,CAAC;AAC9B,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkD,CAAC;AAEzE;;GAEG;AACU,QAAA,oBAAoB,GAAG;IAClC,kBAAkB;QAChB,MAAM,MAAM,GAAG,gBAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,SAAS,GAAG,gBAAM,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC,EAAE,aAAa,CAAC,CAAC;QAClB,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9C,OAAO;YACL,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,SAAiB;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamicAesKeyManager = exports.AESUtil = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 加密工具(纯能力,不参与业务开关 / 中间件)。
|
|
6
|
+
*/
|
|
7
|
+
var AESUtil_1 = require("./AESUtil");
|
|
8
|
+
Object.defineProperty(exports, "AESUtil", { enumerable: true, get: function () { return AESUtil_1.AESUtil; } });
|
|
9
|
+
var DynamicAesKeyManager_1 = require("./DynamicAesKeyManager");
|
|
10
|
+
Object.defineProperty(exports, "DynamicAesKeyManager", { enumerable: true, get: function () { return DynamicAesKeyManager_1.DynamicAesKeyManager; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pangza/encrypt",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "AES encrypt helpers",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"require": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json",
|
|
14
|
+
"./*": {
|
|
15
|
+
"types": "./dist/*.d.ts",
|
|
16
|
+
"require": "./dist/*.js",
|
|
17
|
+
"default": "./dist/*.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.json",
|
|
26
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
}
|
|
35
|
+
}
|