为什么没有用 Bitwarden 自带的密码生成功能呢? 因为这货会存储在历史记录里, 每次还得去清除掉 :'(
需求和 Bitwarden 一样, 生成一个 18 位的密码(这个可以自己调整), 要求如下:
- A-Z (I O 除外, 因为它们容易和 小字母l 和 数字0 混淆)
- a-z
- 0-9
- !?@+-*/= (这些是手机上常见的符号, 没有加上 # 号是因为 Firefox 有个 Bug, 包含 # 后面的代码中的空格会被转换成 %20, 使用上没影响但是跨浏览器不方便, 所以就把 # 去掉了, 这个 Bug 在 Chrome 上不存在)
- 这四组必须都要出现至少一次 (也就是说, 密码必定是包含 大小写字母、数字、特殊符号)
- 点击书签即可生成, 并自动复制到剪贴板中
可读版本:
javascript: (function() {
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]];
}
return array;
}
function generatePassword() {
const lowerCharset = "abcdefghijklmnopqrstuvwxyz";
const upperCharset = "ABCDEFGHJKLMNPQRSTUVWXYZ";
const numberCharset = "0123456789";
const specialCharset = "!?@+-*/=";
const allCharset = lowerCharset + upperCharset + numberCharset + specialCharset;
let password = [lowerCharset[Math.floor(Math.random() * lowerCharset.length)], upperCharset[Math.floor(Math.random() * upperCharset.length)], numberCharset[Math.floor(Math.random() * numberCharset.length)], specialCharset[Math.floor(Math.random() * specialCharset.length)]];
for (let i = 4; i < 18; i++) {
password.push(allCharset[Math.floor(Math.random() * allCharset.length)]);
}
return shuffle(password).join('');
}
const password = generatePassword();
const textBox = document.createElement("textarea");
textBox.value = password;
document.body.appendChild(textBox);
textBox.select();
document.execCommand("copy");
document.body.removeChild(textBox);
alert(password);
})();
压缩版本:
javascript:(function(){function shuffle(array){for(let i=array.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[array[i],array[j]]=[array[j],array[i]];}return array;}function generatePassword(){const lowerCharset="abcdefghijklmnopqrstuvwxyz";const upperCharset="ABCDEFGHJKLMNPQRSTUVWXYZ";const numberCharset="0123456789";const specialCharset="!?@+-*/=";const allCharset=lowerCharset+upperCharset+numberCharset+specialCharset;let password=[lowerCharset[Math.floor(Math.random()*lowerCharset.length)],upperCharset[Math.floor(Math.random()*upperCharset.length)],numberCharset[Math.floor(Math.random()*numberCharset.length)],specialCharset[Math.floor(Math.random()*specialCharset.length)]];for(let i=4;i<18;i++){password.push(allCharset[Math.floor(Math.random()*allCharset.length)]);}return shuffle(password).join('');}const password=generatePassword();const textBox=document.createElement("textarea");textBox.value=password;document.body.appendChild(textBox);textBox.select();document.execCommand("copy");document.body.removeChild(textBox);alert(password);})();
注意, 存为书签使用的 JavaScript 脚本不能有注释, 至少 Firefox 不能有, 不然 // 后面的代码会被 urlencode 掉.
存成书签, 需要使用的时候点击一下就行了, 截至发文之时, Firefox 可以在扩展页内使用(比如 moz-extension:// 或者某个扩展的新标签页), Chrome 必须在正常网页中使用(比如 https:// http://网站).
代码由 ChatGPT 生成, 版本为免费用户的 GPT-4o.