当前位置:   article > 正文

js密码生成器小工具_js.tjorjs.cn

js.tjorjs.cn

此小工具是我突发奇想想的一个密码加密算法, 通过对一个小数的幂指数的不断迭代运算, 可以取得完全打乱字符排列的效果, 用户只要略微更改这密码初值,密码模板,计算指数中的任何一个, 所运算的结果都千差万别,毫无规律。

该小工具完全采用原生js编写,方便用户更改代码, 没有应用任何外部资源, 完全可以断网使用。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no" />
  6. <title>简单密码生成器</title>
  7. <style type="text/css">
  8. html,
  9. body {
  10. padding: 0;
  11. margin: 0;
  12. }
  13. .password-create {
  14. margin: 5px auto;
  15. border: 1px solid gray;
  16. box-shadow: rgba(0, 0, 0, .5) 2px 3px 10px;
  17. border-radius: 0;
  18. width: calc(100% - 10px);
  19. box-sizing: border-box;
  20. overflow-x: hidden;
  21. padding: 10px;
  22. min-width: 340px;
  23. max-width: 500px;
  24. }
  25. .password-create-title {
  26. color: black;
  27. font-size: 18px;
  28. font-weight: bold;
  29. padding: 5px;
  30. margin-bottom: 5px;
  31. }
  32. .row {
  33. width: 100%;
  34. height: 55px;
  35. margin-bottom: 0;
  36. display: flex;
  37. justify-content: flex-start;
  38. align-items: center;
  39. }
  40. .input_label {
  41. height: 32px;
  42. display: flex;
  43. justify-content: flex-end;
  44. align-items: center;
  45. text-align: right;
  46. width: 80px;
  47. font-size: 16px;
  48. }
  49. .input-text {
  50. height: 32px;
  51. display: flex;
  52. justify-content: flex-start;
  53. align-items: center;
  54. padding-left: 5px;
  55. margin-left: 5px;
  56. width: calc(100% - 160px);
  57. font-size: 16px;
  58. }
  59. .btn {
  60. width: 120px;
  61. height: 40px;
  62. display: inline-flex;
  63. justify-content: center;
  64. align-items: center;
  65. color: white;
  66. background: rgb(54, 211, 153);
  67. font-size: 16px;
  68. cursor: pointer;
  69. border: 0px solid rgb(54, 211, 153);
  70. outline: none;
  71. }
  72. .btn:active {
  73. opacity: 0.8;
  74. }
  75. .input-checkbox {
  76. width: 20px;
  77. height: 20px;
  78. }
  79. a {
  80. text-decoration: none;
  81. }
  82. .hint-span {
  83. color: red;
  84. }
  85. .msg {
  86. color: red;
  87. font-size: 20px;
  88. font-weight: bold;
  89. padding-left: 20px;
  90. box-sizing: border-box;
  91. }
  92. .btn-row {
  93. justify-content: flex-end;
  94. text-align: right;
  95. padding-right: 2%;
  96. box-sizing: border-box;
  97. margin-top: 10px;
  98. }
  99. .readme p {
  100. margin: 5px 0;
  101. padding: 0;
  102. font-size: 18px;
  103. font-weight: bold;
  104. color: #333;
  105. }
  106. .readme ul {
  107. list-style-type: none;
  108. padding: 0;
  109. margin: 0;
  110. }
  111. .readme li {
  112. padding: 5px;
  113. margin: 0;
  114. font-size: 16px;
  115. color: #666;
  116. line-height: 26px;
  117. }
  118. .readme .demo-img {
  119. width: 100%;
  120. }
  121. .input-select {
  122. position: relative;
  123. margin-left: 5px;
  124. width: calc(100% - 160px);
  125. font-size: 16px;
  126. box-sizing: border-box;
  127. }
  128. .input-select input {
  129. height: 36px;
  130. display: flex;
  131. justify-content: flex-start;
  132. align-items: center;
  133. width: 100%;
  134. font-size: 16px;
  135. padding-left: 10px;
  136. box-sizing: border-box;
  137. }
  138. .input-select input:focus+.select-wrap {
  139. display: block;
  140. }
  141. .input-select:focus .select-wrap {
  142. display: block;
  143. }
  144. .input-select .select-wrap {
  145. display: none;
  146. box-sizing: border-box;
  147. position: absolute;
  148. width: 100%;
  149. z-index: 1;
  150. top: 100%;
  151. left: 0;
  152. padding: 5px;
  153. background-color: white;
  154. box-shadow: rgba(0, 0, 0, .5) 2px 3px 10px;
  155. }
  156. .input-select .select-wrap .select-option {
  157. height: 32px;
  158. display: flex;
  159. justify-content: flex-start;
  160. align-items: center;
  161. font-size: 16px;
  162. color: #333;
  163. padding: 5px 10px;
  164. cursor: pointer;
  165. user-select: none;
  166. border-bottom: 1px dashed #eee;
  167. }
  168. .input-select .select-wrap .select-option:active {
  169. opacity: 0.8;
  170. background-color: #f2f2f2;
  171. }
  172. </style>
  173. </head>
  174. <body>
  175. <div class="password-create">
  176. <div class="password-create-title">
  177. 密码生成器
  178. </div>
  179. <div id="msg" class="row msg"></div>
  180. <div class="row">
  181. <label for="seedValue" class="input_label">
  182. <span class="hint-span">*</span>
  183. 密码初值:
  184. </label>
  185. <div class="input-select" tabindex="0">
  186. <input type="text" id="seedValueInput" value="" placeholder="请输入密码初始值" />
  187. </div>
  188. <a href="javascript:;" id="clearSeedValueBtn">&nbsp;&nbsp;清空</a>
  189. </div>
  190. <div class="row">
  191. <label for="pwdTpl" class="input_label">
  192. <span class="hint-span">*</span>
  193. 密码模板:
  194. </label>
  195. <div class="input-select" tabindex="0">
  196. <input type="text" id="pwdTplInput" value="" list="pwdTplDataList" placeholder="请输入密码生成模板" />
  197. <div class="select-wrap" id="pwdTplDataList"></div>
  198. </div>
  199. <a href="javascript:;" id="clearPwdTplBtn">&nbsp;&nbsp;清空</a>
  200. </div>
  201. <div class="row">
  202. <label for="createPowInput" class="input_label">
  203. <span class="hint-span">*</span>
  204. 计算指数:
  205. </label>
  206. <div class="input-select" tabindex="0">
  207. <input type="text" id="createPowInput" value="" placeholder="计算指数为小于10的8-15位小数" />
  208. <div class="select-wrap" id="createPowList"></div>
  209. </div>
  210. <a href="javascript:;" id="clearCreatePowBtn">&nbsp;&nbsp;清空</a>
  211. </div>
  212. <div class="row btn-row">
  213. <input type="button" id="createBtn" class="btn" value="生成密码" />
  214. </div>
  215. <div class="readme">
  216. <p>下载地址: &nbsp;&nbsp;<a style="font-size: 16px;" href="./pwd.html"
  217. download='pwd.html'>点此下载该工具</a></p>
  218. <p>使用说明: </p>
  219. <ul>
  220. <li>
  221. 1. 密码初值: 用于生成密码的种子, 可以看做为明密, 可以为任何字符, 可以包含汉字, 长度限制30个字符
  222. </li>
  223. <li>
  224. 2. 密码模板: 用于生成密码的模板, 最终生成的密码格式, 包含数字, 大写字母, 小写字母和特殊字符, 长度限制30个字符
  225. </li>
  226. <li>
  227. 3. 计算指数: 用于密码计算的指数, 该数字为一个小于108-15位小数, 最好为一个无理数的计算结果取前15
  228. </li>
  229. <li>
  230. 4. 把这个文件保存自己的手机或电脑上, 首次使用时一定要自己修改这个文件的模板数据, 不要用这个默认的示例
  231. </li>
  232. <li>
  233. <img class="demo-img"
  234. src="data:image/png;base64,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" />
  235. </li>
  236. </ul>
  237. </div>
  238. </div>
  239. <script type="text/javascript">
  240. "use strict";
  241. let PasswordUtil = function () {
  242. // 此处的配置一定要自行修改, 不要用这个默认的配置
  243. let pwdConfig = {
  244. numberMap: "1234567890",// 所有的数字
  245. uppercaseMap: "abcdefghijklmnopqrstuvwxyz",// 所有的小写字母
  246. lowercaseMap: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",// 所有的大写字母
  247. specialCharacterMap: "~!@#$%^&*()_+-=|/\<>,.;:[]{}",// 所有的特殊字符
  248. randomPow: Math.PI + 1, // 打乱排序的计算指数, 一个杂乱无章的小数 如: 3.141592653589793, 小数位数最多为15
  249. createPow: Math.E + 2, // 生成密码计算指数, 一个杂乱无章的小数 如: 2.718281828459045, 小数位数最多为15
  250. }
  251. try {
  252. charMapRandom()
  253. } catch (e) {
  254. console.error(e)
  255. }
  256. function getRandomChar(s, randomIndex) {
  257. let ch = "";
  258. if (pwdConfig.numberMap.indexOf(s) > -1) {
  259. ch = "" + pwdConfig.numberMap[randomIndex % pwdConfig.numberMap.length];
  260. } else if (pwdConfig.uppercaseMap.indexOf(s) > -1) {
  261. ch = pwdConfig.uppercaseMap[randomIndex % pwdConfig.uppercaseMap.length];
  262. } else if (pwdConfig.lowercaseMap.indexOf(s) > -1) {
  263. ch = pwdConfig.lowercaseMap[randomIndex % pwdConfig.lowercaseMap.length];
  264. } else if (pwdConfig.specialCharacterMap.indexOf(s) > -1) {
  265. ch = pwdConfig.specialCharacterMap[randomIndex % pwdConfig.specialCharacterMap.length];
  266. }
  267. return ch;
  268. }
  269. function getCharWeight(s) {
  270. let weight = 1;
  271. if (pwdConfig.numberMap.indexOf(s) > -1) {
  272. weight = 2;
  273. } else if (pwdConfig.uppercaseMap.indexOf(s) > -1) {
  274. weight = 3;
  275. } else if (pwdConfig.lowercaseMap.indexOf(s) > -1) {
  276. weight = 4;
  277. } else if (pwdConfig.specialCharacterMap.indexOf(s) > -1) {
  278. weight = 5;
  279. }
  280. return weight;
  281. }
  282. // 打乱字符顺序
  283. function charMapRandom() {
  284. randowMap("numberMap")
  285. randowMap("uppercaseMap")
  286. randowMap("lowercaseMap")
  287. randowMap("specialCharacterMap")
  288. function randowMap(filedName) {
  289. let charArr = pwdConfig[filedName].split("")
  290. let len = charArr.length
  291. let precision = 12
  292. for (let i = 0; i < len; i++) {
  293. let randomNum = Math.pow(i + 1, pwdConfig.randomPow).toFixed(precision)
  294. let randomNumArr = randomNum.split(".")[1].split("").reverse()
  295. let randomIndex = parseInt(randomNumArr[0] + randomNumArr[precision / 2] + randomNumArr[precision - 1])
  296. let toIndex = randomIndex % len
  297. let temp = charArr[toIndex]
  298. charArr[toIndex] = charArr[i]
  299. charArr[i] = temp
  300. }
  301. pwdConfig[filedName] = charArr.join("")
  302. }
  303. }
  304. // 生成密码
  305. function createPwd(seedStr, pwdTpl, createPow) {
  306. let seedArr = seedStr.split("")
  307. let pwdTplArr = pwdTpl.split("")
  308. createPow = createPow || pwdConfig.createPow
  309. let seedCodeArr = [];
  310. seedArr.forEach(function (ch, index) {
  311. seedCodeArr.push(ch.charCodeAt());
  312. });
  313. let seedSum = 0;
  314. seedCodeArr.forEach(function (item, index) {
  315. seedSum += item * 1 + index;
  316. });
  317. let pwd = ""
  318. let pwdTplLen = pwdTplArr.length
  319. let seedLen = seedArr.length
  320. let precision = 12
  321. let charWeightSum = pwdTplLen
  322. for (let i = 0; i < pwdTplLen; i++) {
  323. let type = pwdTplArr[i];
  324. charWeightSum += getCharWeight(type);
  325. let randomNum = Math.pow((seedSum + charWeightSum) / (3 * i + 1), pwdConfig.createPow).toFixed(precision);
  326. let randomNumArr = randomNum.split(".")[1].split("").reverse();
  327. let randomIndex = parseInt(randomNumArr[0] + randomNumArr[precision / 2] + randomNumArr[precision - 1]);
  328. pwd += getRandomChar(type, randomIndex);
  329. }
  330. return pwd;
  331. }
  332. return {
  333. pwdConfig,
  334. createPwd,
  335. };
  336. }();
  337. setTimeout(() => {
  338. appInit()
  339. }, 0)
  340. function appInit() {
  341. // 密码模板选项数据
  342. let allPwdTplDataOptions = [
  343. "123456",
  344. "12345678",
  345. "aaa123456",
  346. "aa#123456",
  347. "Aaa123456",
  348. "Aaa#123456",
  349. "Aaa#12345678"
  350. ]
  351. // 计算指数选项数据
  352. let allCreatePowOptions = [
  353. 3.141592653589793,
  354. 2.718281828459045,
  355. 1.414213562373095,
  356. 1.732050807568877,
  357. 2.645751311064591,
  358. ]
  359. let seedValueInputEl = document.getElementById("seedValueInput")
  360. let clearSeedValueBtnEl = document.getElementById("clearSeedValueBtn")
  361. let pwdTplInputEl = document.getElementById("pwdTplInput")
  362. let clearPwdTplBtnEl = document.getElementById("clearPwdTplBtn")
  363. let createPowInputEl = document.getElementById("createPowInput")
  364. let clearCreatePowBtnEl = document.getElementById("clearCreatePowBtn")
  365. let createBtn = document.getElementById("createBtn")
  366. let pwdTplInputSelect = createSelect("pwdTplInput", "pwdTplDataList")
  367. let createPowSelect = createSelect("createPowInput", "createPowList")
  368. pwdTplInputSelect.setData(allPwdTplDataOptions, false)
  369. createPowSelect.setData(allCreatePowOptions, true)
  370. // 清空输入框
  371. clearSeedValueBtnEl.addEventListener("click", function (e) {
  372. seedValueInputEl.value = ""
  373. }, false)
  374. clearPwdTplBtnEl.addEventListener("click", function (e) {
  375. pwdTplInputEl.value = ""
  376. }, false)
  377. clearCreatePowBtnEl.addEventListener("click", function (e) {
  378. createPowInputEl.value = ""
  379. }, false)
  380. // 点击生成密码
  381. createBtn.addEventListener("click", function (e) {
  382. let seedValue = seedValueInputEl.value.trim()
  383. let pwdTpl = pwdTplInputEl.value.trim()
  384. let createPow = createPowInputEl.value
  385. if (!seedValue) {
  386. printMsg("请输入密码初始值")
  387. return false;
  388. }
  389. if (!pwdTpl) {
  390. printMsg("请输入密码生成模板")
  391. return false;
  392. }
  393. if (!checkInputValue(pwdTpl)) {
  394. printMsg("密码生成模板不能包含非法字符")
  395. return false;
  396. }
  397. if (seedValue.length > 30) {
  398. printMsg("密码初始值不能超过30个字符!")
  399. return false;
  400. }
  401. if (pwdTpl.length > 30) {
  402. printMsg("密码模板不能超过30个字符!")
  403. return false;
  404. }
  405. if (!myUtil.isNumeric(createPow)) {
  406. printMsg("请输入计算指数!")
  407. return false;
  408. }
  409. let createPowDotIndex = createPow.indexOf(".")
  410. if (createPowDotIndex == -1 || createPow * 1 > 10) {
  411. printMsg("计算指数必须为小于10的小数!")
  412. return false;
  413. }
  414. let createPowDecimal = createPow.substring(createPowDotIndex + 1)
  415. if (createPowDecimal.length > 15 || createPowDecimal.length < 8) {
  416. printMsg("计算指数小数位数必须为8-15位!")
  417. return false;
  418. }
  419. PasswordUtil.pwdConfig.createPow = createPow * 1
  420. let pwdStr = PasswordUtil.createPwd(seedValue, pwdTpl)
  421. printMsg(`<span style="color:#36d49a">${pwdStr}</span>`)
  422. }, false)
  423. function printMsg(htmlMsg) {
  424. let msgEl = document.getElementById("msg")
  425. if (msgEl) {
  426. msgEl.innerHTML = htmlMsg
  427. }
  428. }
  429. function checkInputValue(value) {
  430. let valueArr = value.split("")
  431. let allStr = PasswordUtil.pwdConfig.numberMap + PasswordUtil.pwdConfig.uppercaseMap +
  432. PasswordUtil.pwdConfig.lowercaseMap + PasswordUtil.pwdConfig.specialCharacterMap;
  433. for (let i = 0; i < valueArr.length; i++) {
  434. if (allStr.indexOf(valueArr[i]) == -1) {
  435. return false
  436. }
  437. }
  438. return true
  439. }
  440. function refreshDataList(id, dataList) {
  441. let html = "";
  442. dataList.forEach(function (val) {
  443. html += '<option value="' + val + '" />';
  444. });
  445. let dataListEl = document.getElementById(id);
  446. if (dataListEl) {
  447. dataListEl.innerHTML = html;
  448. }
  449. }
  450. function createSelect(inputId, inputListId) {
  451. let inputEl = document.getElementById(inputId)
  452. let inputListEl = document.getElementById(inputListId)
  453. let allDataList = []
  454. let showDataList = []
  455. inputEl.addEventListener("input", function (e) {
  456. refreshData()
  457. })
  458. inputEl.addEventListener("focus", function (e) {
  459. refreshData()
  460. })
  461. inputListEl.addEventListener("click", function (e) {
  462. if (e.target.classList.contains("select-option")) {
  463. let item = e.target.dataset.item
  464. inputEl.value = item
  465. inputListEl.parentNode.blur()
  466. }
  467. })
  468. function refreshData() {
  469. let inputValue = inputEl.value.trim()
  470. let showDataList = allDataList
  471. // 过滤选项
  472. // if (inputValue) {
  473. // showDataList = allDataList.filter((item) => {
  474. // return (item + "").indexOf(inputValue) > -1
  475. // })
  476. // }
  477. let html = "";
  478. showDataList.forEach(function (item, index) {
  479. html += `<div data-index="${index}" data-item="${item}" class="select-option">${item}</div>`;
  480. });
  481. if (showDataList.length == 0) {
  482. html += `<div data-index="-1" data-item="" class="select-option">暂无符合条件的数据</div>`;
  483. }
  484. inputListEl.innerHTML = html;
  485. }
  486. function setData(dataList, isInit) {
  487. allDataList = dataList
  488. if (isInit && !inputEl.value && dataList.length > 0) {
  489. inputEl.value = allDataList[0]
  490. }
  491. refreshData()
  492. }
  493. return {
  494. setData
  495. }
  496. }
  497. };
  498. </script>
  499. <script type="text/javascript">
  500. "use strict";
  501. window.myUtil = (function () {
  502. function isType(val) {
  503. return Object.prototype.toString.call(val).slice(8, -1);
  504. }
  505. function isObject(val) {
  506. return isType(val) === 'Object';
  507. }
  508. function isArray(val) {
  509. return isType(val) === 'Array';
  510. }
  511. function isFunction(val) {
  512. return isType(val) === 'Function';
  513. }
  514. function isNumeric(val) {
  515. return (!Number.isNaN(parseFloat(val))) && Number.isFinite(Number(val));
  516. }
  517. let sessionStorage = window.sessionStorage;
  518. let localStorage = window.localStorage;
  519. function saveDataToLocal(saveName, obj, isSessionStorage = true, expireTime) {
  520. if (obj === null) {
  521. if (isSessionStorage) {
  522. sessionStorage.removeItem(saveName)
  523. } else {
  524. localStorage.removeItem(saveName)
  525. }
  526. return;
  527. }
  528. if (obj && (isObject(obj) || isArray(obj))) {
  529. if (isSessionStorage) {
  530. sessionStorage.setItem(saveName, JSON.stringify(obj))
  531. } else {
  532. localStorage.setItem(saveName, JSON.stringify(obj))
  533. }
  534. } else {
  535. if (isSessionStorage) {
  536. sessionStorage.setItem(saveName, obj)
  537. } else {
  538. localStorage.setItem(saveName, obj)
  539. }
  540. }
  541. //存过期时间
  542. if (expireTime) {
  543. let expireTimeObjStr = JSON.stringify({
  544. time: new Date().getTime(),
  545. expireTime: expireTime
  546. });
  547. if (isSessionStorage) {
  548. sessionStorage.setItem(saveName + "ExpireTime", expireTimeObjStr)
  549. } else {
  550. localStorage.setItem(saveName + "ExpireTime", expireTimeObjStr)
  551. }
  552. }
  553. }
  554. function readDataFromLocal(readName, isSessionStorage = true) {
  555. let dataStr = null;
  556. let data = null;
  557. if (isSessionStorage) {
  558. dataStr = sessionStorage.getItem(readName);
  559. } else {
  560. dataStr = localStorage.getItem(readName);
  561. }
  562. if (dataStr && typeof dataStr == 'string') {
  563. //如果过期直接返回null
  564. let expireTimeObj = readDataFromLocal(readName + "ExpireTime", isSessionStorage);
  565. if (expireTimeObj) {
  566. if ((new Date().getTime() - expireTimeObj.time) >= expireTimeObj.expireTime) {
  567. saveDataToLocal(readName, null, isSessionStorage);
  568. return null;
  569. }
  570. }
  571. let first = dataStr.charAt(0);
  572. //如果是数组或对象
  573. if (first === '{' || first === '[') {
  574. data = JSON.parse(dataStr);
  575. } else {
  576. //尝试保持原始数据类型
  577. try {
  578. data = JSON.parse(dataStr);;
  579. } catch (e) {
  580. data = dataStr;
  581. }
  582. }
  583. } else {
  584. data = dataStr;
  585. }
  586. return data;
  587. }
  588. return {
  589. isType,
  590. isObject,
  591. isNumeric,
  592. saveDataToLocal,
  593. readDataFromLocal
  594. }
  595. })()
  596. </script>
  597. </body>
  598. </html>

demo地址: 简单密码生成器

github源码:  GitHub - chengxg/simple-create-password: 简单的密码生成器

  • 1. 密码初值: 用于生成密码的种子, 可以看做为明密, 可以为任何字符, 可以包含汉字, 长度限制30个字符
  • 2. 密码模板: 用于生成密码的模板, 最终生成的密码格式, 包含数字, 大写字母, 小写字母和特殊字符, 长度限制30个字符
  • 3. 计算指数: 用于密码计算的指数, 该数字为一个小于10的8-15位小数, 最好为一个无理数的计算结果取前15位
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/378368
推荐阅读
相关标签
  

闽ICP备14008679号