社会工程学密码生成器(在你的typecho上布置)
这个工具是基于SocialEngineeringDictionaryGenerator工具进行修改的,修改了布局和部分样饰,使其更加适应typecho。
下面是修改后的代码,只要复制后在!!!扩内输入下面代码就可以在你的typecho上布置。
也可以直接用我布置好的:https://blog.hgtrojan.com/index.php/sg.html
<html lang="zh">
<head>
<meta charset="UTF-8">
<style>
html, body {
width: 1200px;
}
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 {
display: flex;
align-items: center;
padding: 8px 15px;
margin: 10px auto; /* 居中显示 */
max-width: 615px; /* 最大宽度为 615px */
font-size: 14px;
background-color: rgb(232, 243, 255);
border: 1px solid transparent;
}
.alert-icon {
width: 1.1em;
margin-right: 8px;
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 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 style="display: flex;">
<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: 700px;" 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>
打赏: 支付宝
本人所有文章均为技术分享,均用于防御为目的的记录,所有操作均在实验环境下进行,请勿用于其他用途,否则后果自负。 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论已关闭