-
Notifications
You must be signed in to change notification settings - Fork 130
/
index.html
664 lines (626 loc) · 43.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>社会工程学密码生成器</title>
<link rel="shortcut icon" href="data:image/x-icon;base64,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HMPs4JAtLTGN5v0dr+NJhaEIdtA2CGBY6vt44ugjbWfkO1vIIZYopFakUWRBWs90ApD0lYgnjiH3kf/rh9N5Q+2EUJKM03nDffT4AIAhqVviiYODz/cp2jta1U4LJcm0d7TC5/sU0svCE/LnaCV7328WxsSUTMDv95G97zcDiPmjT0QcY9zFzv/F2Y7P1E4TJUmcO/85d7HzCICYZopEPcFasePXf4DHo97Z2ZTk4PE48Pp/HkacWgNIXBwjGBo+jN9/uF/ttFEU0nToAIaGDwO4HO/WqfiQHsOud3ei/VyL2umjyORsRwve2rMTwLFEbp+qg/EpvPTyAfQNnFU7nZQp0jdwFtv+7QCAU4kGmao4LsPl2oWfbtuDAdt5tdNLSZCBwQ78dNseuFy7AFxKNBjhYmzzSKQtkdUwGh7EC898HTVLVqmddkoM2s+1YNu//h5uz24AF6PdIqUBueIAgFkAVmDL5oex4Wv3wGgwq50PFBFujwNN/3MAb7+zE8BJxOiApkIcAdbCOns9vvfdv8SSxStS4hhESRy/34dzHSex49d/gG34EICj8YKkUhxAoBZZMG8dNm9qRM3iW5GVJe+QEoo8nM4xtHe04d33mtHZfQRxagsxqRZHgDwAK8Cya3DH6jmoq12AcqsV+fnFyDbnQqczgBBasyiB43zwej2wO8Zw/foVDNhsaD3dieOfDsLn+wS8KKY0UZoucQSDArACqAJQBqAQQC4AA9Renzv98YN37RsDcA38rGoPABsgb6sTWeKgzGzor5giCRUHRRIqDookVBwUSag4KJL8Pw8i7xKpkJX2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA5LTE3VDE1OjE4OjUzKzA4OjAwQlFa4wAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMy0wNC0yMVQyMzoxNjoyMiswODowMCFaf9gAAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQAMTM1JNYMfAAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAxMzW3J1whAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADEzNjY1NTczODLMTHWWAAAAEnRFWHRUaHVtYjo6U2l6ZQA3LjQ1S0KAyO1GAAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTA3My8xMTA3Mzk5LnBuZwPd1RIAAAAASUVORK5CYII=" type="image/x-icon">
<style>
html, body {
margin: 0;
padding: 0;
}
body {
padding-bottom: 24px;
}
label {
width: 100px;
display: inline-block;
text-align: right;
font-size: 14px;
color: #495060;
padding: 10px 12px 10px 0;
}
label:empty {
width: 0;
}
input {
width: 200px;
height: 24px;
padding: 2px 6px;
font-size: 12px;
border: 1px solid #dddee1;
border-radius: 4px;
}
input:hover,input:focus {
border-color: #57a3f3;
box-shadow: 0 0 0 2px #a0c3e7;
}
input:focus {
outline: none;
}
[type='checkbox'] {
display: none;
}
.switch {
width: 40px;
height: 20px;
background: #F1F1F1;
display: inline-block;
border-radius: 20px;
transition: background 0.4s;
padding: 0;
vertical-align: middle;
cursor: pointer;
}
.switch > .ball {
display: block;
width: 16px;
height: 16px;
border-radius: 16px;
background: #E9E9E9;
border: 2px solid #d5d0d0;
transition: all 0.4s;
}
[type='checkbox']:checked + label {
background: #2d8cf0;
}
[type='checkbox']:checked + label > .ball {
margin-left: 20px;
}
[type='checkbox']:active + label > .ball {
width: 30px;
margin-left: 10px;
}
input[type='button'] {
background-color: #57a3f3;
color: white;
border: 1px solid #e4e5e7;
box-shadow: unset;
cursor: pointer;
padding: 0 10px;
height: 35px;
font-size: 14px;
}
.alert-info {
background-color: rgb(232,243,255);
border: 1px solid transparent;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 8px 15px;
margin: 10px 48px;
width: 800px;
font-size: 14px;
}
.alert-icon {
width: 1.1em;
margin: 0 8px 0 0;
color: rgb(22,93,255);
vertical-align: middle;
}
.loading {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding-top: 0;
background-color: rgba(0, 0, 0, 0.4);
}
.loading-bg {
border-radius: 50%;
border: 5px solid #d5d0d0;
border-left: 5px solid rgb(22, 93, 255);
animation: load 1.5s linear infinite;
width: 50px;
height: 50px;
}
@keyframes load {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.nav-item {
height: 100%;
cursor: pointer;
z-index: 1;
}
.nav-item>:first-child {
line-height: 50px;
padding: 0 15px;
}
.nav-item a {
text-align: center;
color: unset;
text-decoration: unset;
}
.nav-item:hover, .nav-item .nav-item-box li:hover {
background-color: #57a3f3;
}
.nav-item .nav-item-box {
max-height: 0;
transition: max-height 0.5s;
overflow: hidden;
}
.nav-item:hover .nav-item-box {
max-height: 2000px;
}
.nav-item .nav-item-box ul {
background-color: #495060;
margin: 0;
padding: 0;
}
.nav-item .nav-item-box li {
padding: 5px;
}
</style>
<script>
function reset() {
document.getElementById('first_name').value = '';
document.getElementById('second_name').value = '';
document.getElementById('third_name').value = '';
document.getElementById('birthday').value = '';
document.getElementById('birthday2').value = '';
document.getElementById('email').value = '';
document.getElementById('mobile').value = '';
document.getElementById('telephone').value = '';
document.getElementById('username').value = '';
document.getElementById('account').value = '';
document.getElementById('organization').value = '';
document.getElementById('company').value = '';
document.getElementById('like_use').value = '';
document.getElementById('id_card').value = '';
document.getElementById('connector').value = '';
document.getElementById('connector_left').checked = false;
document.getElementById('connector_middle').checked = false;
document.getElementById('connector_right').checked = false;
document.getElementById('common').value = '123,888,666,000,111,aaa,abc,qaz,qwe,asd,zxc,!@#,1234,1qaz,qwer,asdf,zxcv,!@#$,1357,2468,0123,6789,6666,8888,12345,123456';
document.getElementById('have_year').checked = false;
document.getElementById('year').value = '';
document.getElementById('number_filter').checked = false;
document.getElementById('string_filter').checked = false;
document.getElementById('long').value = 16;
document.getElementById('short').value = 6;
document.getElementById('capitalize').checked = true;
document.getElementById('lowercase').checked = false;
document.getElementById('uppercase').checked = false;
document.getElementById('result').style.display='none';
}
/**
* 得到字符串大写,包含原文,去空
* @param l list,需要处理的字符串列表
*/
function get_upper(l) {
const upperPattern = new RegExp(".*[a-z].*");
return l.concat(l.map(i=>upperPattern.test(i)?i.toUpperCase():'')).filter(Boolean);
}
/**
* 得到字符串小写,包含原文,去空
* @param l list,需要处理的字符串列表
*/
function get_lower(l) {
const lowerPattern = new RegExp(".*[A-Z].*");
return l.concat(l.map(i=>lowerPattern.test(i)?i.toLowerCase():'')).filter(Boolean);
}
/**
* 首字母大写,包含原文,去空
* @param l list,需要处理的字符串列表
*/
function get_capitalize(l) {
const capitalizePattern = new RegExp("^[a-z].*");
return l.concat(l.map(i=>capitalizePattern.test(i)?i.replace(/( |^)[a-z]/g, (L) => L.toUpperCase()):'')).filter(Boolean);
}
/**
* 去重去空后的列表
* @param l list,需要处理的字符串列表
*/
function get_distinct_list(l) {
return Array.from(new Set(l)).filter(Boolean);
}
/**
* 小于等于x位自动重复, 返回原文及重复后的列表组合,去空
* @param l list,需要重复的列表
* @param x int,小于等于此长度将自动重复
*/
function get_repeat(l, x) {
x = (typeof x === 'undefined') ? 3: x;
const lr = l.map(i => (i.length > 0 && i.length <= x) ? i+i: '');
return l.concat(lr).filter(Boolean);
}
/**
* 取密码前几位及后几位,包含原文,去空
* @param s str, 需要处理的字符串
* @param l int, 需要的长度,可输入任意数量
*/
function get_head_tail(s, ...l) {
return [s].concat(l.map(i=>s.length>i?[s.substring(0,i), s.substring(s.length-i)]:[]).reduce((a, b) => a.concat(b))).filter(Boolean);
}
/**
* 列表去掉过长和过短
* @param l list, 需要处理的字符串列表
* @param start 最小长度
* @param end 最大长度
*/
function drop_short_long(l, start, end) {
start = (typeof start === 'undefined') ? 6: start;
end = (typeof end === 'undefined') ? 16: end;
return l.filter(i=>((start ? i.length>=start : true) && (end ? i.length<=end : true)));
}
/**
* 去掉纯字母或纯数字
* @param l 需要处理的字符串列表
* @param rtype 可选str或int
*/
function drop_string_int(l, rtype) {
if (['str', 'int'].indexOf(rtype) < 0) {
return l;
}
const pattern = rtype === 'str' ? /^[a-zA-Z]*$/ : /^[0-9]*$/;
return l.filter(i=>!pattern.test(i));
}
/**
* 计算array的笛卡尔积,相当于python中的itertools.product
* calc_descartes([['2019', '2020'], ['白色', '灰色', '蓝色']]) => ['2019白色', '2019灰色', '2019蓝色', '2020白色', '2020灰色', '2020蓝色']
* @param array
*/
function calc_descartes(array) {
if (array.length < 2) return array[0] || [];
return array.reduce((total, currentValue) => {
let res = [];
total.forEach(t => {
currentValue.forEach(cv => {
res.push([t, cv]);
})
})
return res;
})
}
/**
* 数组排列组合,等于python中的itertools.permutations,permutations([1,2,3,4], 2) => [[1,2],[1,3],[1,4],[2,1],[2,3],[2,4],[3,1],[3,2],[3,4],[4,1],[4,2],[4,3]]
* @param arr 源数组
* @param size 选取元素的个数
*/
function permutations(arr, size) {
//定义数组保存结果
let result = [];
//selected数组包含已经选中的元素
//arr数组包含未选中元素数组,size表示还需选取元素的个数
function _combine(selected, arr, size) {
//如果size===0,则一次组合完成,存入result数组并返回
if (size === 0) {
result.push(selected);
return;
}
//遍历所有可能选中的元素,遍历的次数为数组长度减去(size-1)
for (let i = 0; i < arr.length; i++) {
//复制数组,避免对selected数组数据的更改
let temp = selected.slice();
temp.push(arr[i]);
_combine(temp, arr.slice(0, i).concat(arr.slice(i + 1)), size - 1);
}
}
_combine([], arr, size);
return result;
}
function show_loading() {
const loading = document.getElementById('loading');
loading.style.display = 'block';
}
function hide_loading() {
const loading = document.getElementById('loading');
loading.style.display = 'none';
}
function main() {
show_loading();
setTimeout(() => {
const start_time = new Date().getTime();
const pass_list = generate();
const pass_first_length = document.getElementById('pass_first_length');
const pass_first_text = document.getElementById('pass_first_text');
const pass_second_length = document.getElementById('pass_second_length');
const pass_second_text = document.getElementById('pass_second_text');
const pass_third_length = document.getElementById('pass_third_length');
const pass_third_text = document.getElementById('pass_third_text');
const pass_all_length = document.getElementById('pass_all_length');
const pass_all_text = document.getElementById('pass_all_text');
const result = document.getElementById('result');
pass_first_text.value=pass_list[0].join('\n');
pass_first_text.rows=pass_list[0].length;
pass_first_length.innerText=pass_list[0].length.toString();
pass_second_text.value=pass_list[1].join('\n');
pass_second_text.rows=pass_list[1].length;
pass_second_length.innerText=pass_list[1].length.toString();
pass_third_text.value=pass_list[2].join('\n');
pass_third_text.rows=pass_list[2].length;
pass_third_length.innerText=pass_list[2].length.toString();
let pass_all = pass_list.flat();
pass_all_text.value=pass_all.join('\n');
pass_all_text.rows=pass_all.length;
pass_all_length.innerText=pass_all.length.toString();
result.style.display='flex';
const end_time = new Date().getTime();
console.log(`cost ${end_time - start_time}ms`)
hide_loading();
}, 0);
}
function download() {
const list = generate().flat();
console.log(list.length);
const ele = document.createElement('a');
ele.download = "passwords.txt";
ele.style.display = "none";
const blob = new Blob([list.join("\n")]);
ele.href = URL.createObjectURL(blob);
document.body.appendChild(ele);
ele.click();
document.body.removeChild(ele);
}
function generate() {
const first_name = document.getElementById('first_name')['value'];
const second_name = document.getElementById('second_name')['value'];
const third_name = document.getElementById('third_name')['value'];
const birthday = document.getElementById('birthday')['value'];
const birthday2 = document.getElementById('birthday2')['value'];
const email = document.getElementById('email')['value'];
const mobile = document.getElementById('mobile')['value'];
const telephone = document.getElementById('telephone')['value'];
const username = document.getElementById('username')['value'];
const account = document.getElementById('account')['value'];
const organization = document.getElementById('organization')['value'];
const company = document.getElementById('company')['value'];
const like_use = document.getElementById('like_use')['value'];
const id_card = document.getElementById('id_card')['value'];
const work_no = document.getElementById('work_no')['value'];
const connector = document.getElementById('connector')['value'].split('');
const connector_left = document.getElementById('connector_left')['checked'];
const connector_middle = document.getElementById('connector_middle')['checked'];
const connector_right = document.getElementById('connector_right')['checked'];
const common = document.getElementById('common')['value'];
const have_year = document.getElementById('have_year')['checked'];
const year = parseInt(document.getElementById('year')['value']);
const number_filter = document.getElementById('number_filter')['checked'];
const string_filter = document.getElementById('string_filter')['checked'];
const long = parseInt(document.getElementById('long')['value']);
const short = parseInt(document.getElementById('short')['value']);
const capitalize = document.getElementById('capitalize')['checked'];
const lowercase = document.getElementById('lowercase')['checked'];
const uppercase = document.getElementById('uppercase')['checked'];
const first_name_combine = /^[a-zA-Z0-9]+$/.test(first_name) ? get_repeat([first_name], 3) : [''];
const last_name_combine = /^[a-zA-Z0-9]+$/.test(second_name + third_name) ? get_repeat([second_name + third_name], 3) : [''];
let name_all = [first_name_combine[0] + last_name_combine[0], last_name_combine[0] + first_name_combine[0]];
const last_name_a_b = second_name.substring(0, 1) + third_name.substring(0, 1);
name_all = name_all.concat([first_name.substring(0, 1) + last_name_a_b, first_name_combine[0] + last_name_a_b, last_name_a_b + first_name.substring(0, 1), last_name_a_b + first_name_combine[0], first_name.substring(0, 1) + second_name + third_name, second_name + third_name, first_name]);
name_all = name_all.concat(get_repeat(get_head_tail(username, 3, 4))).concat(get_repeat(get_head_tail(account, 3, 4)))
name_all = get_distinct_list(name_all);
console.log('name_all', name_all);
let birthday_all = [];
let b = birthday.replaceAll('-', '');
let b2 = birthday2.replaceAll('-', '');
birthday_all = birthday_all.concat(get_head_tail(b, 4)).concat(get_head_tail(b2, 4));
birthday_all = birthday_all.concat(b.substring(4, 5) === '0' ? [b.substring(5, 8), b.substring(5, 8) + b.substring(5, 8)] : []);
birthday_all = birthday_all.concat(b2.substring(4, 5) === '0' ? [b2.substring(5, 8), b2.substring(5, 8) + b2.substring(5, 8)] : []);
birthday_all = get_distinct_list(birthday_all);
console.log('birthday_all', birthday_all);
const email_all = get_distinct_list([email].concat(get_repeat(get_head_tail(email.split('@')[0], 3, 4), 3)));
console.log('email_all', email_all);
let phone_all = get_distinct_list(get_repeat(get_head_tail(mobile, 3, 4, 5, 6)).concat(get_repeat(get_head_tail(telephone, 3, 4, 5, 6))));
console.log('phone_all', phone_all);
let id_card_all = id_card.length > 0 ? get_distinct_list(get_repeat(get_head_tail(id_card, 3, 4, 6, 8).concat(get_head_tail(id_card.substring(0, id_card.length - 1), 3, 4, 6, 8).slice(1)))) : [];
console.log('id_card_all', id_card_all);
let work_no_all = get_distinct_list(get_repeat(get_head_tail(work_no, 3, 4, 6, 8)));
console.log('work_no_all', work_no_all);
let org_all = get_distinct_list([organization, company].map(i => get_repeat(get_head_tail(i, 3, 4))).reduce((a, b) => a.concat(b)));
console.log('org_all', org_all);
let like_all = get_distinct_list(like_use.split(',').map(i => get_repeat(get_head_tail(i, 3, 4))).reduce((a, b) => a.concat(b)));
console.log('like_all', like_all);
let common_all = common.split(',');
if (have_year) {
Array.from(Array(year), (el, i) => common_all.push((new Date().getFullYear() - year + i).toString()));
}
console.log('common_all', common_all);
let pass_list_all = [name_all, birthday_all, email_all, phone_all, id_card_all, work_no_all, org_all, like_all, common_all];
let pass_first = pass_list_all.reduce((a, b) => a.concat(b));
console.log('pass_first', pass_first);
let pass_second = [];
let pass_third = [];
permutations(pass_list_all, 2).forEach(passArr => {
let pass_combine = calc_descartes(passArr);
pass_second = pass_second.concat(pass_combine.map(p=>p[0]+p[1]));
pass_combine.forEach(p=>{
connector.forEach(c=>{
if (connector_left) {
pass_third.push(c+p[0]+p[1]);
}
if (connector_middle) {
pass_third.push(p[0]+c+p[1]);
}
if (connector_right) {
pass_third.push(p[0]+p[1]+c);
}
});
});
});
let pass_list = [pass_first, pass_second, pass_third];
pass_list = pass_list.map(i => drop_short_long(i, short, long));
if (number_filter) {
pass_list = pass_list.map(i => drop_string_int(i, 'int'));
}
if (string_filter) {
pass_list = pass_list.map(i => drop_string_int(i, 'str'));
}
if (capitalize) {
pass_list = pass_list.map(i => get_capitalize(i));
}
if (lowercase) {
pass_list = pass_list.map(i => get_lower(i));
}
if (uppercase) {
pass_list = pass_list.map(i => get_upper(i));
}
pass_list = pass_list.map(i => get_distinct_list(i));
return pass_list;
}
function copy(cid) {
const textNode = document.getElementById(cid);
textNode.select();
document.execCommand("Copy");
textNode.blur();
const notification = document.getElementById('notification');
notification.style.right = '20px';
notification.style.visibility = 'visible';
notification.style.opacity = '1';
setTimeout(()=>{
notification.style.right = '-20px';
notification.style.visibility = 'hidden';
notification.style.opacity = '0';
}, 3000)
}
</script>
</head>
<body>
<div style="color: white;background-color: #495060;height: 50px;display: flex;justify-content: space-between;align-items: center;">
<div style="display: flex;margin-left: 40px;height: 100%;">
<div class="nav-item" style="background-color: #57a3f3;"><a href="/">首页</a></div>
<div class="nav-item"><a href="https://github.com/zgjx6/SocialEngineeringDictionaryGenerator" target="_blank">GITHUB</a></div>
<div class="nav-item">
<div>链接</div>
<div class="nav-item-box">
<ul>
<li title="https://github.com/r35tart/RW_Password"><a href="https://github.com/r35tart/RW_Password" target="_blank">RW_Password</a></li>
<li title="https://github.com/danielmiessler/SecLists"><a href="https://github.com/danielmiessler/SecLists" target="_blank">SecLists</a></li>
<li title="https://github.com/rootphantomer/Blasting_dictionary"><a href="https://github.com/rootphantomer/Blasting_dictionary" target="_blank">Blasting_dictionary</a></li>
<li title="https://github.com/epony4c/Exploit-Dictionary"><a href="https://github.com/epony4c/Exploit-Dictionary" target="_blank">Exploit-Dictionary</a></li>
<li title="https://github.com/Stardustsky/SaiDict"><a href="https://github.com/Stardustsky/SaiDict" target="_blank">SaiDict</a></li>
<li title="https://github.com/fuzz-security/SuperWordlist"><a href="https://github.com/fuzz-security/SuperWordlist" target="_blank">SuperWordlist</a></li>
<li title="https://github.com/RicterZ/genpAss/tree/master"><a href="https://github.com/RicterZ/genpAss/tree/master" target="_blank">genpAss</a></li>
<li title="https://github.com/tennc/fuzzdb"><a href="https://github.com/tennc/fuzzdb" target="_blank">tennc-fuzzdb</a></li>
<li title="https://github.com/fuzzdb-project/fuzzdb"><a href="https://github.com/fuzzdb-project/fuzzdb" target="_blank">FuzzDB</a></li>
<li title="https://github.com/TheKingOfDuck/fuzzDicts"><a href="https://github.com/TheKingOfDuck/fuzzDicts" target="_blank">fuzzDicts</a></li>
</ul>
</div>
</div>
</div>
<div class="nav-item" style="margin-right: 10px;padding: 0 10px;display: flex;align-items: center;">V1.2.0</div>
</div>
<div class="alert-info">
<svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm2-30a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2Zm0 17h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-8a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v11Z" fill="currentColor" stroke="none"></path></svg>
<span>所有输入框均是选填, 尽量减少无效输入以避免生成结果过多</span>
</div>
<div class="alert-info">
<svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm2-30a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2Zm0 17h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-8a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v11Z" fill="currentColor" stroke="none"></path></svg>
<span>所有代码均开源, 功能均使用原生js实现, 不会访问任何外部资源, 可以尝试使用自己的信息测试, 如有问题请<a href="https://github.com/zgjx6/SocialEngineeringDictionaryGenerator/issues">提交issue</a></span>
</div>
<div>
<label for="first_name">姓名</label><input type="text" name="first_name" id="first_name" placeholder="请输入姓(英文)" title="请输入姓(英文)" />
<label for="second_name"></label><input type="text" name="second_name" id="second_name" placeholder="请输入名的第一个字(英文)" title="请输入名的第一个字(英文)" />
<label for="third_name"></label><input type="text" name="third_name" id="third_name" placeholder="请输入名的第二个字(如果有,英文)" title="请输入名的第二个字(如果有,英文)" />
</div>
<div>
<label for="birthday">生日</label><input type="date" name="birthday" id="birthday" placeholder="公历生日" title="公历生日" />
<label for="birthday2"></label><input type="date" name="birthday2" id="birthday2" placeholder="农历生日" title="农历生日" />
</div>
<div>
<label for="email">邮件</label><input type="email" name="email" id="email" placeholder="请输入邮箱" title="请输入邮箱" />
</div>
<div>
<label for="mobile">电话</label><input type="tel" name="mobile" id="mobile" placeholder="请输入座机号,不要-号" title="请输入座机号,不要-号" />
<label for="telephone"></label><input type="tel" name="telephone" id="telephone" placeholder="请输入手机号" title="请输入手机号" />
</div>
<div>
<label for="username">用户名</label><input type="text" name="username" id="username" placeholder="请输入用户名(英文)" title="请输入用户名(英文)" />
<label for="account"></label><input type="text" name="account" id="account" placeholder="请输入用户账号" title="请输入用户账号" />
</div>
<div>
<label for="organization">组织</label><input type="text" name="organization" id="organization" placeholder="请输入组织名(英文)" title="请输入组织名(英文)" />
<label for="company"></label><input type="text" name="company" id="company" placeholder="请输入公司名(英文)" title="请输入公司名(英文)" />
</div>
<div>
<label for="like_use">短语</label><input type="text" name="like_use" id="like_use" style="width: 320px;" placeholder="请输入常用短语(英文),如iloveyou,多个用逗号分隔" title="请输入常用短语(英文),如iloveyou,多个用逗号分隔" />
</div>
<div>
<label for="id_card">身份证号</label><input type="text" name="id_card" id="id_card" placeholder="请输入身份证号" title="请输入身份证号" />
</div>
<div>
<label for="work_no">工号</label><input type="text" name="work_no" id="work_no" placeholder="请输入工号" title="请输入工号" />
</div>
<div>
<label for="connector">连接符</label>
<label for="connector_left" style="width: 30px;padding-right: 5px;">左</label><input type="checkbox" name="connector_left" id="connector_left" value="左"/><label class="switch" for="connector_left"><span class="ball"></span></label>
<label for="connector_middle" style="width: 30px;padding-right: 5px;">中</label><input type="checkbox" name="connector_middle" id="connector_middle" value="中"/><label class="switch" for="connector_middle"><span class="ball"></span></label>
<label for="connector_right" style="width: 30px;padding-right: 5px;">右</label><input type="checkbox" name="connector_right" id="connector_right" value="右"/><label class="switch" for="connector_right"><span class="ball"></span></label>
<input type="text" name="connector" id="connector" style="width: 500px;" placeholder="请输入连接符(如.!_-#@:$&*~?%+=/|),尽量减少,否则会极大增加密码数量" title="请输入连接符(如.!_-#@:$&*~?%+=/|),尽量减少,否则会极大增加密码数量" />
<span title="连接符用于连接两条信息. 如姓zhang且生日为0229,用@在中间连接则为zhang@0229" style="cursor: help"><svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm-3.862-24.021a.461.461 0 0 0 .462-.462 2.37 2.37 0 0 1 .636-1.615C21.64 17.48 22.43 17 23.988 17c1.465 0 2.483.7 3.002 1.493.555.848.446 1.559.182 1.914-.328.444-.736.853-1.228 1.296-.15.135-.335.296-.533.468-.354.308-.75.654-1.067.955C23.22 24.195 22 25.686 22 28v.013a1 1 0 0 0 1.006.993l2.008-.012a.993.993 0 0 0 .986-1c.002-.683.282-1.19 1.101-1.97.276-.262.523-.477.806-.722.21-.18.439-.379.713-.626.57-.513 1.205-1.13 1.767-1.888 1.516-2.047 1.161-4.634-.05-6.485C29.092 14.398 26.825 13 23.988 13c-2.454 0-4.357.794-5.642 2.137-1.25 1.307-1.742 2.954-1.746 4.37 0 .26.21.472.47.472h3.068Zm1.868 14.029a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V32a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2.008Z" fill="currentColor" stroke="none"></path></svg></span>
</div>
<div>
<label for="common">常用词组</label><input type="text" name="common" id="common" style="width: 800px;" value="123,888,666,000,111,aaa,abc,qaz,qwe,asd,zxc,!@#,1234,1qaz,qwer,asdf,zxcv,!@#$,1357,2468,0123,6789,6666,8888,12345,123456" placeholder="请输入常用词组,如123456,abcd等,多个用逗号分隔" title="请输入常用词组,如123456,abcd等,多个用逗号分隔" />
</div>
<div>
<label for="have_year">最近年份</label><input type="checkbox" name="have_year" id="have_year"/><label class="switch" for="have_year"><span class="ball"></span></label>
<label for="year" style="display: none"></label><input type="number" name="year" id="year" style="width: 100px;" placeholder="最近几年的年份,如果要特定年份可以输入到常用词组中" title="最近几年的年份,如果要特定年份可以输入到常用词组中" value="10"/>
</div>
<div>
<label for="number_filter">去掉纯数字</label><input type="checkbox" name="number_filter" id="number_filter"/><label class="switch" for="number_filter"><span class="ball"></span></label>
</div>
<div>
<label for="string_filter">去掉纯字母</label><input type="checkbox" name="string_filter" id="string_filter"/><label class="switch" for="string_filter"><span class="ball"></span></label>
</div>
<div>
<label>长度</label>
<label for="short" style="width: 80px;padding-right: 5px;">不能小于</label><input type="number" name="short" id="short" style="width: 100px;" placeholder="请输入最小长度, 0为忽略" title="请输入最小长度, 0为忽略" value="6" />
<label for="long" style="width: 60px;padding-right: 5px;">不能大于</label><input type="number" name="long" id="long" style="width: 100px;" placeholder="请输入最大长度, 0为忽略" title="请输入最大长度, 0为忽略" value="16" />
</div>
<div>
<label>大小写</label>
<label for="capitalize" style="width: 80px;padding-right: 5px;">首字母大写</label><input type="checkbox" checked="checked" name="capitalize" id="capitalize" value="首字母大写"/><label class="switch" for="capitalize"><span class="ball"></span></label>
<label for="lowercase" style="width: 50px;padding-right: 5px;">全小写</label><input type="checkbox" name="lowercase" id="lowercase" value="全小写"/><label class="switch" for="lowercase"><span class="ball"></span></label>
<label for="uppercase" style="width: 50px;padding-right: 5px;">全大写</label><input type="checkbox" name="uppercase" id="uppercase" value="全大写"/><label class="switch" for="uppercase"><span class="ball"></span></label>
</div>
<div style="margin: 20px 0 0 50px;">
<label for="generate"></label><input type="button" name="generate" id="generate" value="生成密码" onclick="main()" />
<label for="reset"></label><input type="button" name="reset" id="reset" value="重置" onclick="reset()"/>
<label for="download"></label><input type="button" name="download" id="download" value="下载" onclick="download()"/>
</div>
<div style="margin-top: 50px;display: none;" id="result">
<div style="width: 350px;text-align: center;">
<div style="margin-bottom: 10px;">
<span>单项信息密码-<span id="pass_first_length"></span>个</span>
<input type="button" name="pass_first_copy" id="pass_first_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_first_text')" />
</div>
<label for="pass_first_text" style="display: none"></label><textarea id="pass_first_text" cols="25"></textarea>
</div>
<div style="width: 350px;text-align: center;">
<div style="margin-bottom: 10px;">
<span>两项信息密码-<span id="pass_second_length"></span>个</span>
<input type="button" name="pass_second_copy" id="pass_second_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_second_text')" />
</div>
<label for="pass_second_text" style="display: none"></label><textarea id="pass_second_text" cols="25"></textarea>
</div>
<div style="width: 350px;text-align: center;">
<div style="margin-bottom: 10px;">
<span>两项信息加连接符密码-<span id="pass_third_length"></span>个</span>
<input type="button" name="pass_third_copy" id="pass_third_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_third_text')" />
</div>
<label for="pass_third_text" style="display: none"></label><textarea id="pass_third_text" cols="25"></textarea>
</div>
<div style="width: 350px;text-align: center;">
<div style="margin-bottom: 10px;">
<span>全部密码-<span id="pass_all_length"></span>个</span>
<input type="button" name="pass_all_copy" id="pass_all_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_all_text')" />
</div>
<label for="pass_all_text" style="display: none"></label><textarea id="pass_all_text" cols="25"></textarea>
</div>
</div>
<div id="loading" style="display: none;">
<div class="loading">
<div class="loading-bg"></div>
</div>
</div>
<div id="notification" style="position: fixed;right: -20px;top: 20px;visibility: hidden;opacity: 0;width: 160px; height: 60px; background-color: white; text-align: center;line-height: 60px;border: 1px solid rgb(229,230,235);border-radius: 4px;box-shadow: 0 4px 10px #0000001a;transition: right 0.4s ease-out, opacity 0.2s ease-in, visibility 0.2s ease-in;"><svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm2-30a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2Zm0 17h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-8a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v11Z" fill="currentColor" stroke="none"></path></svg>已复制</div>
</body>
</html>