@pengzi/kms 1.0.0

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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -0
  3. package/dist/client.d.ts +130 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +266 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +20 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +54 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/asymmetric-crypto.d.ts +81 -0
  12. package/dist/core/asymmetric-crypto.d.ts.map +1 -0
  13. package/dist/core/asymmetric-crypto.js +171 -0
  14. package/dist/core/asymmetric-crypto.js.map +1 -0
  15. package/dist/core/crypto.d.ts +37 -0
  16. package/dist/core/crypto.d.ts.map +1 -0
  17. package/dist/core/crypto.js +100 -0
  18. package/dist/core/crypto.js.map +1 -0
  19. package/dist/core/crypto.service.d.ts +35 -0
  20. package/dist/core/crypto.service.d.ts.map +1 -0
  21. package/dist/core/crypto.service.js +67 -0
  22. package/dist/core/crypto.service.js.map +1 -0
  23. package/dist/core/key-derivation.d.ts +25 -0
  24. package/dist/core/key-derivation.d.ts.map +1 -0
  25. package/dist/core/key-derivation.js +96 -0
  26. package/dist/core/key-derivation.js.map +1 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +51 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/models/audit.model.d.ts +40 -0
  32. package/dist/models/audit.model.d.ts.map +1 -0
  33. package/dist/models/audit.model.js +83 -0
  34. package/dist/models/audit.model.js.map +1 -0
  35. package/dist/models/key.model.d.ts +40 -0
  36. package/dist/models/key.model.d.ts.map +1 -0
  37. package/dist/models/key.model.js +120 -0
  38. package/dist/models/key.model.js.map +1 -0
  39. package/dist/models/project.model.d.ts +20 -0
  40. package/dist/models/project.model.d.ts.map +1 -0
  41. package/dist/models/project.model.js +54 -0
  42. package/dist/models/project.model.js.map +1 -0
  43. package/dist/models/user.model.d.ts +48 -0
  44. package/dist/models/user.model.d.ts.map +1 -0
  45. package/dist/models/user.model.js +141 -0
  46. package/dist/models/user.model.js.map +1 -0
  47. package/dist/repositories/audit.repository.d.ts +37 -0
  48. package/dist/repositories/audit.repository.d.ts.map +1 -0
  49. package/dist/repositories/audit.repository.js +116 -0
  50. package/dist/repositories/audit.repository.js.map +1 -0
  51. package/dist/repositories/base.repository.d.ts +54 -0
  52. package/dist/repositories/base.repository.d.ts.map +1 -0
  53. package/dist/repositories/base.repository.js +97 -0
  54. package/dist/repositories/base.repository.js.map +1 -0
  55. package/dist/repositories/key.repository.d.ts +60 -0
  56. package/dist/repositories/key.repository.d.ts.map +1 -0
  57. package/dist/repositories/key.repository.js +126 -0
  58. package/dist/repositories/key.repository.js.map +1 -0
  59. package/dist/repositories/project.repository.d.ts +42 -0
  60. package/dist/repositories/project.repository.d.ts.map +1 -0
  61. package/dist/repositories/project.repository.js +82 -0
  62. package/dist/repositories/project.repository.js.map +1 -0
  63. package/dist/repositories/user.repository.d.ts +58 -0
  64. package/dist/repositories/user.repository.d.ts.map +1 -0
  65. package/dist/repositories/user.repository.js +102 -0
  66. package/dist/repositories/user.repository.js.map +1 -0
  67. package/dist/services/audit.service.d.ts +63 -0
  68. package/dist/services/audit.service.d.ts.map +1 -0
  69. package/dist/services/audit.service.js +113 -0
  70. package/dist/services/audit.service.js.map +1 -0
  71. package/dist/services/auth.service.d.ts +39 -0
  72. package/dist/services/auth.service.d.ts.map +1 -0
  73. package/dist/services/auth.service.js +179 -0
  74. package/dist/services/auth.service.js.map +1 -0
  75. package/dist/services/key.service.d.ts +47 -0
  76. package/dist/services/key.service.d.ts.map +1 -0
  77. package/dist/services/key.service.js +135 -0
  78. package/dist/services/key.service.js.map +1 -0
  79. package/dist/services/permission.service.d.ts +37 -0
  80. package/dist/services/permission.service.d.ts.map +1 -0
  81. package/dist/services/permission.service.js +140 -0
  82. package/dist/services/permission.service.js.map +1 -0
  83. package/dist/services/project.service.d.ts +37 -0
  84. package/dist/services/project.service.d.ts.map +1 -0
  85. package/dist/services/project.service.js +96 -0
  86. package/dist/services/project.service.js.map +1 -0
  87. package/dist/types/audit.types.d.ts +122 -0
  88. package/dist/types/audit.types.d.ts.map +1 -0
  89. package/dist/types/audit.types.js +55 -0
  90. package/dist/types/audit.types.js.map +1 -0
  91. package/dist/types/client.types.d.ts +47 -0
  92. package/dist/types/client.types.d.ts.map +1 -0
  93. package/dist/types/client.types.js +6 -0
  94. package/dist/types/client.types.js.map +1 -0
  95. package/dist/types/crypto.types.d.ts +48 -0
  96. package/dist/types/crypto.types.d.ts.map +1 -0
  97. package/dist/types/crypto.types.js +6 -0
  98. package/dist/types/crypto.types.js.map +1 -0
  99. package/dist/types/index.d.ts +86 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +92 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/types/key.types.d.ts +125 -0
  104. package/dist/types/key.types.d.ts.map +1 -0
  105. package/dist/types/key.types.js +28 -0
  106. package/dist/types/key.types.js.map +1 -0
  107. package/dist/types/project.types.d.ts +57 -0
  108. package/dist/types/project.types.d.ts.map +1 -0
  109. package/dist/types/project.types.js +16 -0
  110. package/dist/types/project.types.js.map +1 -0
  111. package/dist/types/user.types.d.ts +110 -0
  112. package/dist/types/user.types.d.ts.map +1 -0
  113. package/dist/types/user.types.js +49 -0
  114. package/dist/types/user.types.js.map +1 -0
  115. package/dist/utils/config-loader.d.ts +64 -0
  116. package/dist/utils/config-loader.d.ts.map +1 -0
  117. package/dist/utils/config-loader.js +126 -0
  118. package/dist/utils/config-loader.js.map +1 -0
  119. package/dist/utils/constants.d.ts +62 -0
  120. package/dist/utils/constants.d.ts.map +1 -0
  121. package/dist/utils/constants.js +119 -0
  122. package/dist/utils/constants.js.map +1 -0
  123. package/dist/utils/error-handler.d.ts +48 -0
  124. package/dist/utils/error-handler.d.ts.map +1 -0
  125. package/dist/utils/error-handler.js +109 -0
  126. package/dist/utils/error-handler.js.map +1 -0
  127. package/package.json +53 -0
package/dist/client.js ADDED
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ /**
3
+ * KMS客户端主类
4
+ * 对外API接口
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.KMSClient = void 0;
8
+ const mongodb_1 = require("mongodb");
9
+ const crypto_service_1 = require("./core/crypto.service");
10
+ const project_repository_1 = require("./repositories/project.repository");
11
+ const key_repository_1 = require("./repositories/key.repository");
12
+ const user_repository_1 = require("./repositories/user.repository");
13
+ const audit_repository_1 = require("./repositories/audit.repository");
14
+ const project_service_1 = require("./services/project.service");
15
+ const key_service_1 = require("./services/key.service");
16
+ const auth_service_1 = require("./services/auth.service");
17
+ const permission_service_1 = require("./services/permission.service");
18
+ const audit_service_1 = require("./services/audit.service");
19
+ const error_handler_1 = require("./utils/error-handler");
20
+ const asymmetric_crypto_1 = require("./core/asymmetric-crypto");
21
+ /**
22
+ * KMS客户端类
23
+ */
24
+ class KMSClient {
25
+ options;
26
+ mongoClient;
27
+ db;
28
+ cryptoService;
29
+ projectRepo;
30
+ keyRepo;
31
+ userRepo;
32
+ auditRepo;
33
+ projectService;
34
+ keyService;
35
+ authService;
36
+ permissionService;
37
+ auditService;
38
+ connected = false;
39
+ currentUserId = null;
40
+ constructor(options) {
41
+ this.options = options;
42
+ const connectionString = this.resolveConnectionString(options);
43
+ this.mongoClient = new mongodb_1.MongoClient(connectionString, {
44
+ connectTimeoutMS: this.options.connectionOptions?.connectTimeoutMS || 10000,
45
+ socketTimeoutMS: this.options.connectionOptions?.socketTimeoutMS || 30000,
46
+ serverSelectionTimeoutMS: this.options.connectionOptions?.serverSelectionTimeoutMS || 10000,
47
+ maxPoolSize: this.options.connectionOptions?.maxPoolSize || 10,
48
+ minPoolSize: this.options.connectionOptions?.minPoolSize || 0,
49
+ });
50
+ }
51
+ /**
52
+ * 解析连接字符串(支持加密配置)
53
+ */
54
+ resolveConnectionString(options) {
55
+ // 如果是加密配置,先解密
56
+ if ('encryptedConnectionString' in options) {
57
+ const encrypted = JSON.parse(options.encryptedConnectionString);
58
+ const privateKey = options.privateKey || process.env.KMS_PRIVATE_KEY;
59
+ if (!privateKey) {
60
+ throw (0, error_handler_1.createKMSError)(error_handler_1.ErrorCode.CONNECTION_FAILED, 'Private key is required for encrypted connection string. Set KMS_PRIVATE_KEY environment variable or pass privateKey option.');
61
+ }
62
+ const passphrase = options.privateKeyPassphrase || process.env.KMS_PRIVATE_KEY_PASSPHRASE;
63
+ return (0, asymmetric_crypto_1.parseEncryptedConnectionStringConfig)({ encryptedConnectionString: options.encryptedConnectionString }, privateKey, passphrase);
64
+ }
65
+ // 普通配置直接返回连接字符串
66
+ return options.connectionString;
67
+ }
68
+ /**
69
+ * 连接到数据库
70
+ */
71
+ async connect() {
72
+ if (this.connected) {
73
+ return;
74
+ }
75
+ try {
76
+ await this.mongoClient.connect();
77
+ this.db = this.mongoClient.db(this.options.databaseName);
78
+ this.connected = true;
79
+ // 初始化服务和仓储
80
+ this.initializeServices();
81
+ // 创建索引
82
+ await this.initializeIndexes();
83
+ }
84
+ catch (error) {
85
+ throw (0, error_handler_1.createKMSError)(error_handler_1.ErrorCode.CONNECTION_FAILED, error instanceof Error ? error.message : 'Failed to connect to database');
86
+ }
87
+ }
88
+ /**
89
+ * 断开数据库连接
90
+ */
91
+ async disconnect() {
92
+ if (this.connected) {
93
+ await this.mongoClient.close();
94
+ this.connected = false;
95
+ }
96
+ }
97
+ /**
98
+ * 初始化服务
99
+ */
100
+ initializeServices() {
101
+ this.cryptoService = new crypto_service_1.CryptoService();
102
+ this.projectRepo = new project_repository_1.ProjectRepository(this.db);
103
+ this.keyRepo = new key_repository_1.KeyRepository(this.db);
104
+ this.userRepo = new user_repository_1.UserRepository(this.db);
105
+ this.auditRepo = new audit_repository_1.AuditRepository(this.db);
106
+ this.auditService = new audit_service_1.AuditService(this.auditRepo);
107
+ this.permissionService = new permission_service_1.PermissionService(this.userRepo, this.auditService);
108
+ this.projectService = new project_service_1.ProjectService(this.projectRepo, this.userRepo, this.auditService, this.cryptoService);
109
+ this.authService = new auth_service_1.AuthService(this.userRepo, this.auditService);
110
+ this.keyService = new key_service_1.KeyService(this.keyRepo, this.auditService, this.permissionService, this.cryptoService);
111
+ }
112
+ /**
113
+ * 初始化数据库索引
114
+ */
115
+ async initializeIndexes() {
116
+ // 索引在Repository的构造函数中自动创建
117
+ }
118
+ /**
119
+ * 设置当前用户(用于权限验证)
120
+ */
121
+ setCurrentUser(userId) {
122
+ this.currentUserId = userId;
123
+ }
124
+ /**
125
+ * 获取当前用户ID
126
+ */
127
+ getCurrentUserId() {
128
+ if (!this.currentUserId) {
129
+ throw (0, error_handler_1.createKMSError)(error_handler_1.ErrorCode.AUTHENTICATION_FAILED, 'No user context set');
130
+ }
131
+ return this.currentUserId;
132
+ }
133
+ // ============ 项目管理 ============
134
+ /**
135
+ * 创建项目
136
+ */
137
+ async createProject(projectName, masterPassword, metadata) {
138
+ await this.ensureConnected();
139
+ const userId = this.getCurrentUserId();
140
+ return await this.projectService.createProject({ projectName, masterPassword, metadata }, userId);
141
+ }
142
+ /**
143
+ * 获取项目
144
+ */
145
+ async getProject(projectId) {
146
+ await this.ensureConnected();
147
+ return await this.projectService.getProject(projectId);
148
+ }
149
+ /**
150
+ * 列出所有项目
151
+ */
152
+ async listProjects() {
153
+ await this.ensureConnected();
154
+ return await this.projectService.listProjects();
155
+ }
156
+ /**
157
+ * 删除项目
158
+ */
159
+ async deleteProject(projectId) {
160
+ await this.ensureConnected();
161
+ const userId = this.getCurrentUserId();
162
+ await this.projectService.deleteProject(projectId, userId);
163
+ }
164
+ // ============ 密钥管理 ============
165
+ /**
166
+ * 创建密钥
167
+ */
168
+ async createKey(projectId, masterPassword, keyData) {
169
+ await this.ensureConnected();
170
+ const userId = this.getCurrentUserId();
171
+ return await this.keyService.createKey(projectId, userId, masterPassword, keyData);
172
+ }
173
+ /**
174
+ * 获取密钥(解密)
175
+ */
176
+ async getKey(projectId, masterPassword, keyId) {
177
+ await this.ensureConnected();
178
+ const userId = this.getCurrentUserId();
179
+ return await this.keyService.getKey(projectId, userId, masterPassword, keyId);
180
+ }
181
+ /**
182
+ * 列出密钥
183
+ */
184
+ async listKeys(projectId, filters, options) {
185
+ await this.ensureConnected();
186
+ const userId = this.getCurrentUserId();
187
+ return await this.keyService.listKeys(projectId, userId, filters, options);
188
+ }
189
+ /**
190
+ * 更新密钥
191
+ */
192
+ async updateKey(projectId, masterPassword, keyId, updates) {
193
+ await this.ensureConnected();
194
+ const userId = this.getCurrentUserId();
195
+ return await this.keyService.updateKey(projectId, userId, masterPassword, keyId, updates);
196
+ }
197
+ /**
198
+ * 删除密钥
199
+ */
200
+ async deleteKey(projectId, keyId) {
201
+ await this.ensureConnected();
202
+ const userId = this.getCurrentUserId();
203
+ await this.keyService.deleteKey(projectId, userId, keyId);
204
+ }
205
+ // ============ 用户管理 ============
206
+ /**
207
+ * 创建用户
208
+ */
209
+ async createUser(projectId, userData) {
210
+ await this.ensureConnected();
211
+ const userId = this.getCurrentUserId();
212
+ return await this.authService.createUser(projectId, userId, userData);
213
+ }
214
+ /**
215
+ * 用户登录
216
+ */
217
+ async login(projectId, username, password) {
218
+ await this.ensureConnected();
219
+ const result = await this.authService.login(projectId, { username, password });
220
+ if (result.success && result.user) {
221
+ this.setCurrentUser(result.user.userId);
222
+ }
223
+ return result.success;
224
+ }
225
+ /**
226
+ * 授予角色
227
+ */
228
+ async grantRole(projectId, userId, role) {
229
+ await this.ensureConnected();
230
+ const currentUserId = this.getCurrentUserId();
231
+ await this.permissionService.grantRole(projectId, currentUserId, userId, role);
232
+ }
233
+ /**
234
+ * 撤销角色
235
+ */
236
+ async revokeRole(projectId, userId, role) {
237
+ await this.ensureConnected();
238
+ const currentUserId = this.getCurrentUserId();
239
+ await this.permissionService.revokeRole(projectId, currentUserId, userId, role);
240
+ }
241
+ // ============ 审计日志 ============
242
+ /**
243
+ * 获取审计日志
244
+ */
245
+ async getAuditLogs(projectId, query) {
246
+ await this.ensureConnected();
247
+ return await this.auditService.getAuditLogs(projectId, query);
248
+ }
249
+ /**
250
+ * 获取最近的审计日志
251
+ */
252
+ async getRecentLogs(projectId, limit = 100) {
253
+ await this.ensureConnected();
254
+ return await this.auditService.getRecentLogs(projectId, limit);
255
+ }
256
+ /**
257
+ * 确保已连接
258
+ */
259
+ async ensureConnected() {
260
+ if (!this.connected) {
261
+ throw (0, error_handler_1.createKMSError)(error_handler_1.ErrorCode.CONNECTION_FAILED, 'Client not connected. Call connect() first.');
262
+ }
263
+ }
264
+ }
265
+ exports.KMSClient = KMSClient;
266
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 配置管理
3
+ */
4
+ import { KMSClientOptions } from './types';
5
+ /**
6
+ * 默认配置
7
+ */
8
+ export declare const DEFAULT_CONFIG: Partial<KMSClientOptions>;
9
+ /**
10
+ * 合并配置
11
+ */
12
+ export declare function mergeConfig(userConfig: KMSClientOptions): KMSClientOptions;
13
+ /**
14
+ * 验证配置
15
+ */
16
+ export declare function validateConfig(config: KMSClientOptions): {
17
+ valid: boolean;
18
+ errors: string[];
19
+ };
20
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,gBAAgB,CASpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,gBAAgB,GAAG,gBAAgB,CAS1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAmB7F"}
package/dist/config.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * 配置管理
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CONFIG = void 0;
7
+ exports.mergeConfig = mergeConfig;
8
+ exports.validateConfig = validateConfig;
9
+ /**
10
+ * 默认配置
11
+ */
12
+ exports.DEFAULT_CONFIG = {
13
+ databaseName: 'kms',
14
+ connectionOptions: {
15
+ connectTimeoutMS: 10000,
16
+ socketTimeoutMS: 30000,
17
+ serverSelectionTimeoutMS: 10000,
18
+ maxPoolSize: 10,
19
+ minPoolSize: 0,
20
+ },
21
+ };
22
+ /**
23
+ * 合并配置
24
+ */
25
+ function mergeConfig(userConfig) {
26
+ return {
27
+ ...exports.DEFAULT_CONFIG,
28
+ ...userConfig,
29
+ connectionOptions: {
30
+ ...exports.DEFAULT_CONFIG.connectionOptions,
31
+ ...userConfig.connectionOptions,
32
+ },
33
+ };
34
+ }
35
+ /**
36
+ * 验证配置
37
+ */
38
+ function validateConfig(config) {
39
+ const errors = [];
40
+ if (!config.connectionString) {
41
+ errors.push('Connection string is required');
42
+ }
43
+ if (!config.databaseName) {
44
+ errors.push('Database name is required');
45
+ }
46
+ if (config.connectionString && !config.connectionString.startsWith('mongodb')) {
47
+ errors.push('Invalid connection string format');
48
+ }
49
+ return {
50
+ valid: errors.length === 0,
51
+ errors,
52
+ };
53
+ }
54
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAsBH,kCASC;AAKD,wCAmBC;AAlDD;;GAEG;AACU,QAAA,cAAc,GAA8B;IACvD,YAAY,EAAE,KAAK;IACnB,iBAAiB,EAAE;QACjB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,KAAK;QACtB,wBAAwB,EAAE,KAAK;QAC/B,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;KACf;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,WAAW,CAAC,UAA4B;IACtD,OAAO;QACL,GAAG,sBAAc;QACjB,GAAG,UAAU;QACb,iBAAiB,EAAE;YACjB,GAAG,sBAAc,CAAC,iBAAiB;YACnC,GAAG,UAAU,CAAC,iBAAiB;SAChC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAwB;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 非对称加密服务
3
+ * 使用 RSA-OAEP 加密敏感数据(如数据库连接字符串)
4
+ * 特点:
5
+ * - 公钥加密,私钥解密
6
+ * - 即使加密数据泄露,没有私钥也无法解密
7
+ * - 私钥可以使用密码保护
8
+ */
9
+ /**
10
+ * RSA 密钥对
11
+ */
12
+ export interface RSAKeyPair {
13
+ publicKey: string;
14
+ privateKey: string;
15
+ }
16
+ /**
17
+ * 加密后的连接字符串
18
+ */
19
+ export interface EncryptedConnectionString {
20
+ encrypted: string;
21
+ algorithm: string;
22
+ keyId?: string;
23
+ }
24
+ /**
25
+ * 生成 RSA 密钥对
26
+ * @param passphrase 私钥密码(可选,但强烈推荐)
27
+ * @returns RSA 密钥对
28
+ */
29
+ export declare function generateRSAKeyPair(passphrase?: string): RSAKeyPair;
30
+ /**
31
+ * 使用公钥加密连接字符串
32
+ * @param connectionString 明文连接字符串
33
+ * @param publicKeyPem PEM 格式公钥
34
+ * @returns 加密后的连接字符串
35
+ */
36
+ export declare function encryptConnectionString(connectionString: string, publicKeyPem: string): EncryptedConnectionString;
37
+ /**
38
+ * 使用私钥解密连接字符串
39
+ * @param encryptedData 加密的连接字符串
40
+ * @param privateKeyPem PEM 格式私钥
41
+ * @param passphrase 私钥密码(如果私钥有密码保护)
42
+ * @returns 明文连接字符串
43
+ */
44
+ export declare function decryptConnectionString(encryptedData: EncryptedConnectionString, privateKeyPem: string, passphrase?: string): string;
45
+ /**
46
+ * 从环境变量安全地获取私钥密码
47
+ * @returns 密码字符串
48
+ */
49
+ export declare function getPrivateKeyPassphrase(): string | undefined;
50
+ /**
51
+ * 验证 PEM 格式的密钥
52
+ * @param pem PEM 格式密钥
53
+ * @returns 是否有效
54
+ */
55
+ export declare function isValidPEMKey(pem: string): boolean;
56
+ /**
57
+ * 生成密钥 ID(用于密钥轮换)
58
+ * @returns 密钥 ID
59
+ */
60
+ export declare function generateKeyId(): string;
61
+ /**
62
+ * 创建加密的连接字符串配置对象
63
+ * @param connectionString 明文连接字符串
64
+ * @param publicKeyPem 公钥
65
+ * @param keyId 密钥标识(可选)
66
+ * @returns 加密配置
67
+ */
68
+ export declare function createEncryptedConnectionStringConfig(connectionString: string, publicKeyPem: string, keyId?: string): {
69
+ encryptedConnectionString: string;
70
+ };
71
+ /**
72
+ * 从加密配置解析连接字符串
73
+ * @param config 配置对象
74
+ * @param privateKeyPem 私钥
75
+ * @param passphrase 私钥密码
76
+ * @returns 明文连接字符串
77
+ */
78
+ export declare function parseEncryptedConnectionStringConfig(config: {
79
+ encryptedConnectionString: string;
80
+ }, privateKeyPem: string, passphrase?: string): string;
81
+ //# sourceMappingURL=asymmetric-crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asymmetric-crypto.d.ts","sourceRoot":"","sources":["../../src/core/asymmetric-crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAsBlE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,GACnB,yBAAyB,CAoB3B;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,yBAAyB,EACxC,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAmBR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAG5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWlD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED;;;;;;GAMG;AACH,wBAAgB,qCAAqC,CACnD,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,GACb;IAAE,yBAAyB,EAAE,MAAM,CAAA;CAAE,CAQvC;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,MAAM,EAAE;IAAE,yBAAyB,EAAE,MAAM,CAAA;CAAE,EAC7C,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAGR"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * 非对称加密服务
4
+ * 使用 RSA-OAEP 加密敏感数据(如数据库连接字符串)
5
+ * 特点:
6
+ * - 公钥加密,私钥解密
7
+ * - 即使加密数据泄露,没有私钥也无法解密
8
+ * - 私钥可以使用密码保护
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.generateRSAKeyPair = generateRSAKeyPair;
12
+ exports.encryptConnectionString = encryptConnectionString;
13
+ exports.decryptConnectionString = decryptConnectionString;
14
+ exports.getPrivateKeyPassphrase = getPrivateKeyPassphrase;
15
+ exports.isValidPEMKey = isValidPEMKey;
16
+ exports.generateKeyId = generateKeyId;
17
+ exports.createEncryptedConnectionStringConfig = createEncryptedConnectionStringConfig;
18
+ exports.parseEncryptedConnectionStringConfig = parseEncryptedConnectionStringConfig;
19
+ const crypto_1 = require("crypto");
20
+ const types_1 = require("../types");
21
+ /**
22
+ * RSA 加密配置
23
+ */
24
+ const RSA_CONFIG = {
25
+ algorithm: 'rsa',
26
+ modulusLength: 4096, // 4096 位密钥(更安全)
27
+ publicKeyEncoding: {
28
+ type: 'spki',
29
+ format: 'pem'
30
+ },
31
+ privateKeyEncoding: {
32
+ type: 'pkcs8',
33
+ format: 'pem',
34
+ cipher: 'aes-256-cbc', // 私钥加密算法
35
+ passphrase: undefined
36
+ },
37
+ padding: crypto_1.constants.RSA_PKCS1_OAEP_PADDING,
38
+ oaepHash: 'sha256'
39
+ };
40
+ /**
41
+ * 生成 RSA 密钥对
42
+ * @param passphrase 私钥密码(可选,但强烈推荐)
43
+ * @returns RSA 密钥对
44
+ */
45
+ function generateRSAKeyPair(passphrase) {
46
+ try {
47
+ const options = {
48
+ ...RSA_CONFIG,
49
+ privateKeyEncoding: {
50
+ ...RSA_CONFIG.privateKeyEncoding,
51
+ passphrase: passphrase
52
+ }
53
+ };
54
+ const { publicKey, privateKey } = (0, crypto_1.generateKeyPairSync)('rsa', options);
55
+ return {
56
+ publicKey,
57
+ privateKey
58
+ };
59
+ }
60
+ catch (error) {
61
+ throw new types_1.CryptoError(`Failed to generate RSA key pair: ${error instanceof Error ? error.message : 'Unknown error'}`);
62
+ }
63
+ }
64
+ /**
65
+ * 使用公钥加密连接字符串
66
+ * @param connectionString 明文连接字符串
67
+ * @param publicKeyPem PEM 格式公钥
68
+ * @returns 加密后的连接字符串
69
+ */
70
+ function encryptConnectionString(connectionString, publicKeyPem) {
71
+ try {
72
+ // RSA OAEP 加密
73
+ const encrypted = (0, crypto_1.publicEncrypt)({
74
+ key: publicKeyPem,
75
+ padding: RSA_CONFIG.padding,
76
+ oaepHash: RSA_CONFIG.oaepHash
77
+ }, Buffer.from(connectionString, 'utf-8'));
78
+ return {
79
+ encrypted: encrypted.toString('base64'),
80
+ algorithm: 'RSA-OAEP-4096',
81
+ keyId: undefined
82
+ };
83
+ }
84
+ catch (error) {
85
+ throw new types_1.CryptoError(`Failed to encrypt connection string: ${error instanceof Error ? error.message : 'Unknown error'}`);
86
+ }
87
+ }
88
+ /**
89
+ * 使用私钥解密连接字符串
90
+ * @param encryptedData 加密的连接字符串
91
+ * @param privateKeyPem PEM 格式私钥
92
+ * @param passphrase 私钥密码(如果私钥有密码保护)
93
+ * @returns 明文连接字符串
94
+ */
95
+ function decryptConnectionString(encryptedData, privateKeyPem, passphrase) {
96
+ try {
97
+ const encryptedBuffer = Buffer.from(encryptedData.encrypted, 'base64');
98
+ // RSA OAEP 解密
99
+ const decrypted = (0, crypto_1.privateDecrypt)({
100
+ key: privateKeyPem,
101
+ passphrase: passphrase,
102
+ padding: RSA_CONFIG.padding,
103
+ oaepHash: RSA_CONFIG.oaepHash
104
+ }, encryptedBuffer);
105
+ return decrypted.toString('utf-8');
106
+ }
107
+ catch (error) {
108
+ throw new types_1.CryptoError(`Failed to decrypt connection string: ${error instanceof Error ? error.message : 'Invalid password or corrupted data'}`);
109
+ }
110
+ }
111
+ /**
112
+ * 从环境变量安全地获取私钥密码
113
+ * @returns 密码字符串
114
+ */
115
+ function getPrivateKeyPassphrase() {
116
+ const passphrase = process.env.KMS_PRIVATE_KEY_PASSPHRASE;
117
+ return passphrase?.trim() || undefined;
118
+ }
119
+ /**
120
+ * 验证 PEM 格式的密钥
121
+ * @param pem PEM 格式密钥
122
+ * @returns 是否有效
123
+ */
124
+ function isValidPEMKey(pem) {
125
+ try {
126
+ const trimmed = pem.trim();
127
+ return (trimmed.includes('-----BEGIN') &&
128
+ trimmed.includes('-----END') &&
129
+ trimmed.includes('KEY-----'));
130
+ }
131
+ catch {
132
+ return false;
133
+ }
134
+ }
135
+ /**
136
+ * 生成密钥 ID(用于密钥轮换)
137
+ * @returns 密钥 ID
138
+ */
139
+ function generateKeyId() {
140
+ const timestamp = Date.now().toString(36);
141
+ const random = (0, crypto_1.randomBytes)(4).toString('hex');
142
+ return `key_${timestamp}_${random}`;
143
+ }
144
+ /**
145
+ * 创建加密的连接字符串配置对象
146
+ * @param connectionString 明文连接字符串
147
+ * @param publicKeyPem 公钥
148
+ * @param keyId 密钥标识(可选)
149
+ * @returns 加密配置
150
+ */
151
+ function createEncryptedConnectionStringConfig(connectionString, publicKeyPem, keyId) {
152
+ const encrypted = encryptConnectionString(connectionString, publicKeyPem);
153
+ if (keyId) {
154
+ encrypted.keyId = keyId;
155
+ }
156
+ return {
157
+ encryptedConnectionString: JSON.stringify(encrypted)
158
+ };
159
+ }
160
+ /**
161
+ * 从加密配置解析连接字符串
162
+ * @param config 配置对象
163
+ * @param privateKeyPem 私钥
164
+ * @param passphrase 私钥密码
165
+ * @returns 明文连接字符串
166
+ */
167
+ function parseEncryptedConnectionStringConfig(config, privateKeyPem, passphrase) {
168
+ const encrypted = JSON.parse(config.encryptedConnectionString);
169
+ return decryptConnectionString(encrypted, privateKeyPem, passphrase);
170
+ }
171
+ //# sourceMappingURL=asymmetric-crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asymmetric-crypto.js","sourceRoot":"","sources":["../../src/core/asymmetric-crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 加密/解密工具函数
3
+ */
4
+ import { EncryptedData } from '../types';
5
+ /**
6
+ * 生成随机字节
7
+ */
8
+ export declare function generateRandomBytes(length: number): Buffer;
9
+ /**
10
+ * 生成随机IV
11
+ */
12
+ export declare function generateIV(): Buffer;
13
+ /**
14
+ * 使用AES-256-GCM加密数据
15
+ */
16
+ export declare function encryptAES256GCM(plaintext: string, key: Buffer): EncryptedData;
17
+ /**
18
+ * 使用AES-256-GCM解密数据
19
+ */
20
+ export declare function decryptAES256GCM(encryptedData: string, iv: string, authTag: string, key: Buffer): string;
21
+ /**
22
+ * 比较两个恒定时间字符串(防止时序攻击)
23
+ */
24
+ export declare function timingSafeEqual(a: string, b: string): boolean;
25
+ /**
26
+ * 生成随机密钥
27
+ */
28
+ export declare function generateRandomKey(): Buffer;
29
+ /**
30
+ * 从十六进制字符串转换为Buffer
31
+ */
32
+ export declare function hexToBuffer(hex: string): Buffer;
33
+ /**
34
+ * 将Buffer转换为十六进制字符串
35
+ */
36
+ export declare function bufferToHex(buffer: Buffer): string;
37
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/core/crypto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAe,MAAM,UAAU,CAAC;AAGtD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAkB9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAkB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD"}