{"id":769,"date":"2026-06-19T13:37:00","date_gmt":"2026-06-19T13:37:00","guid":{"rendered":"https:\/\/silcom.io\/?page_id=769"},"modified":"2026-06-22T20:28:56","modified_gmt":"2026-06-22T10:28:56","slug":"password-generator-and-checker","status":"publish","type":"page","link":"https:\/\/silcom.io\/password-generator-and-checker\/","title":{"rendered":"Password Generator and Checker"},"content":{"rendered":"\t<section class=\"silcom-password-tool\" data-silcom-password-tool>\n\t\t<div class=\"silcom-password-tool__inner\">\n\t\t\t<nav class=\"silcom-tax-tool__breadcrumb\" aria-label=\"Breadcrumb\">\n\t\t\t\t<a href=\"https:\/\/silcom.io\/\">Home<\/a><span aria-hidden=\"true\">\/<\/span><span>Password Generator and Checker<\/span>\n\t\t\t<\/nav>\n\t\t\t<div class=\"silcom-password-tool__header\">\n\t\t\t\t<p>Silcom Tools<\/p>\n\t\t\t\t<h1>Password Generator and Checker<\/h1>\n\t\t\t\t<span>Generate memorable passphrases or random character passwords, then check strength locally in your browser. Nothing is sent or stored.<\/span>\n\t\t\t<\/div>\n\t\t\t<div class=\"silcom-password-tool__grid\">\n\t\t\t\t<section class=\"silcom-password-card\">\n\t\t\t\t\t<h2>Password generator<\/h2>\n\t\t\t\t\t<div class=\"silcom-password-field\">\n\t\t\t\t\t\t<label>Password style<\/label>\n\t\t\t\t\t\t<select data-passgen-field=\"mode\">\n\t\t\t\t\t\t\t<option value=\"memorable\">Memorable password<\/option>\n\t\t\t\t\t\t\t<option value=\"random\">Random characters<\/option>\n\t\t\t\t\t\t<\/select>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"silcom-password-options\" data-passgen-memorable>\n\t\t\t\t\t\t<label class=\"silcom-password-field\">How many words?<select data-passgen-field=\"words\"><option value=\"1\">1 word<\/option><option value=\"2\">2 words<\/option><option value=\"3\" selected>3 words<\/option><option value=\"4\">4 words<\/option><option value=\"5\">5 words<\/option><\/select><\/label>\n\t\t\t\t\t\t<label class=\"silcom-password-field\">Separator<select data-passgen-field=\"separator\"><option value=\"-\">Dash<\/option><option value=\".\">Dot<\/option><option value=\"\">No separator<\/option><\/select><\/label>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"silcom-password-options\" data-passgen-random hidden>\n\t\t\t\t\t\t<label class=\"silcom-password-field\">Characters<select data-passgen-field=\"length\"><option value=\"12\">12<\/option><option value=\"16\" selected>16<\/option><option value=\"20\">20<\/option><option value=\"24\">24<\/option><option value=\"32\">32<\/option><\/select><\/label>\n\t\t\t\t\t\t<label class=\"silcom-password-toggle\"><input type=\"checkbox\" data-passgen-field=\"uppercase\" checked> Uppercase<\/label>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"silcom-password-options\">\n\t\t\t\t\t\t<label class=\"silcom-password-toggle\"><input type=\"checkbox\" data-passgen-field=\"numbers\" checked> Add numbers<\/label>\n\t\t\t\t\t\t<label class=\"silcom-password-toggle\"><input type=\"checkbox\" data-passgen-field=\"symbols\" checked> Add symbols<\/label>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"silcom-password-output\">\n\t\t\t\t\t\t<input type=\"text\" readonly data-passgen-output aria-label=\"Generated password\">\n\t\t\t\t\t\t<button type=\"button\" data-passgen-copy>Copy<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"silcom-password-meter\" data-passgen-meter><span><\/span><\/div>\n\t\t\t\t\t<div class=\"silcom-password-verdict\" data-passgen-verdict><\/div>\n\t\t\t\t\t<button class=\"silcom-password-primary\" type=\"button\" data-passgen-refresh>Generate password<\/button>\n\t\t\t\t<\/section>\n\t\t\t\t\t<section class=\"silcom-password-card\">\n\t\t\t\t\t\t<h2>Password checker<\/h2>\n\t\t\t\t\t\t<label class=\"silcom-password-field\">Type or paste password<input type=\"password\" data-passcheck-input autocomplete=\"off\" placeholder=\"Check strength locally\"><\/label>\n\t\t\t\t\t<label class=\"silcom-password-toggle\"><input type=\"checkbox\" data-passcheck-show> Show password<\/label>\n\t\t\t\t\t<div class=\"silcom-password-meter silcom-password-meter--checker\" data-passcheck-meter><span><\/span><\/div>\n\t\t\t\t\t<div class=\"silcom-password-verdict\" data-passcheck-verdict>Start typing to check strength.<\/div>\n\t\t\t\t\t<ul class=\"silcom-password-checklist\">\n\t\t\t\t\t\t<li data-check-rule=\"length\">12+ characters or 3+ memorable words<\/li>\n\t\t\t\t\t\t<li data-check-rule=\"variety\">Mix of lowercase, uppercase, numbers or symbols<\/li>\n\t\t\t\t\t\t<li data-check-rule=\"common\">Avoid common password words and simple sequences<\/li>\n\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<p class=\"silcom-password-note\">This checker estimates strength from length, variety, passphrase word count and common weak patterns. It does not send the password anywhere.<\/p>\n\t\t\t\t\t<\/section>\n\t\t\t\t\t<section class=\"silcom-password-card silcom-password-card--wide\">\n\t\t\t\t\t\t<h2>Code \/ Decode Playground<\/h2>\n\t\t\t\t\t\t<p class=\"silcom-password-note\">A reversible password remix tool. It is useful for playful codes and memorable password ideas, not high-security encryption.<\/p>\n\t\t\t\t\t\t<div class=\"silcom-password-options\">\n\t\t\t\t\t\t\t<label class=\"silcom-password-field\">Action<select data-code-field=\"action\"><option value=\"encode\">Encode<\/option><option value=\"decode\">Decode<\/option><\/select><\/label>\n\t\t\t\t\t\t\t<label class=\"silcom-password-field\">Method<select data-code-field=\"method\"><option value=\"shift\">Letter shift<\/option><option value=\"numbers\">Text to number code<\/option><option value=\"blocks\">Reverse blocks<\/option><option value=\"fragments\">Group fragments<\/option><\/select><\/label>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"silcom-password-options\">\n\t\t\t\t\t\t\t<label class=\"silcom-password-field\">Code key \/ shift<input type=\"number\" min=\"1\" max=\"25\" value=\"7\" data-code-field=\"key\"><\/label>\n\t\t\t\t\t\t\t<label class=\"silcom-password-field\" data-code-fragment-count>Fragments<select data-code-field=\"fragments\"><option value=\"2\">2 pieces<\/option><option value=\"3\" selected>3 pieces<\/option><option value=\"4\">4 pieces<\/option><option value=\"5\">5 pieces<\/option><\/select><\/label>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<label class=\"silcom-password-field\">Input<textarea rows=\"5\" data-code-input placeholder=\"Type a phrase, password idea, sentence, or paste code fragments here\"><\/textarea><\/label>\n\t\t\t\t\t\t<div class=\"silcom-password-output silcom-password-output--textarea\">\n\t\t\t\t\t\t\t<textarea rows=\"6\" readonly data-code-output aria-label=\"Coded output\"><\/textarea>\n\t\t\t\t\t\t\t<button type=\"button\" data-code-copy>Copy<\/button>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"silcom-password-verdict\" data-code-status>Choose a method and type something to encode or decode.<\/div>\n\t\t\t\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/section>\n\t<script>\n\t(function(){\n\t\tvar root=document.querySelector('[data-silcom-password-tool]'); if(!root)return;\n\t\tvar words=['anchor','aurora','backup','bridge','cable','cipher','cloud','copper','delta','domain','ember','fabric','filter','frost','galaxy','harbor','kernel','lantern','matrix','meadow','network','orbit','pixel','portal','quartz','river','router','signal','silver','summit','switch','thunder','timber','vault','vector','vivid','window','zephyr'];\n\t\tvar weakWords=['password','admin','welcome','qwerty','letmein','login','silcom','company','user','test','abc','1234'];\n\t\tfunction field(name){return root.querySelector('[data-passgen-field=\"'+name+'\"]');}\n\t\tfunction codeField(name){return root.querySelector('[data-code-field=\"'+name+'\"]');}\n\t\tfunction checked(name){var el=field(name); return el ? el.checked : false;}\n\t\tfunction pick(list){var a=new Uint32Array(1); crypto.getRandomValues(a); return list[a[0]%list.length];}\n\t\tfunction randChar(chars){return pick(chars.split(''));}\n\t\tfunction classify(score){if(score>=85)return{label:'Excellent',className:'is-excellent'}; if(score>=68)return{label:'Strong',className:'is-strong'}; if(score>=44)return{label:'Good enough',className:'is-good'}; if(score>=24)return{label:'Weak',className:'is-weak'}; return{label:'Very weak',className:'is-poor'};}\n\t\tfunction scorePassword(value){var pass=value||'', score=0, lower=\/[a-z]\/.test(pass), upper=\/[A-Z]\/.test(pass), digit=\/[0-9]\/.test(pass), symbol=\/[^A-Za-z0-9]\/.test(pass), variety=0, parts=pass.split(\/[-_.\\\\s]+\/).filter(function(item){return item.length>1;}), lowerPass=pass.toLowerCase(); if(lower)variety++; if(upper)variety++; if(digit)variety++; if(symbol)variety++; score+=Math.min(45, pass.length*3); score+=variety*10; if(parts.length>=3)score+=22; if(parts.length>=4)score+=10; if(pass.length>=16)score+=8; if(\/(.)\\\\1\\\\1\/.test(pass))score-=12; if(\/1234|abcd|qwerty|password\/i.test(pass))score-=24; weakWords.forEach(function(word){if(lowerPass.indexOf(word)>-1)score-=10;}); score=Math.max(0,Math.min(100,score)); return{score:score,variety:variety,parts:parts.length,length:pass.length,lower:lower,upper:upper,digit:digit,symbol:symbol,common:\/1234|abcd|qwerty|password\/i.test(pass)};}\n\t\tfunction renderMeter(meter,verdict,value){var info=scorePassword(value), state=classify(info.score), bar=meter.querySelector('span'); meter.className=meter.className.replace(\/\\bis-[a-z-]+\\b\/g,'').trim()+' '+state.className; bar.style.width=info.score+'%'; verdict.textContent=state.label+' - '+info.score+'\/100'; return info;}\n\t\tfunction updateGeneratorVisibility(){var memorable=field('mode').value==='memorable'; root.querySelector('[data-passgen-memorable]').hidden=!memorable; root.querySelector('[data-passgen-random]').hidden=memorable;}\n\t\tfunction generate(){var mode=field('mode').value, output=root.querySelector('[data-passgen-output]'), password='', number=String(Math.floor(10+Math.random()*90)), symbol=pick(['!','@','#','$','%','?','+']); updateGeneratorVisibility(); if(mode==='memorable'){var count=parseInt(field('words').value,10)||3, sep=field('separator').value, chosen=[]; for(var i=0;i<count;i++){var word=pick(words); chosen.push(word.charAt(0).toUpperCase()+word.slice(1));} password=chosen.join(sep); if(checked('numbers'))password+=sep+number; if(checked('symbols'))password+=symbol;}else{var chars='abcdefghijklmnopqrstuvwxyz'; if(checked('uppercase'))chars+='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; if(checked('numbers'))chars+='0123456789'; if(checked('symbols'))chars+='!@#$%?+-_'; var len=parseInt(field('length').value,10)||16; for(var j=0;j<len;j++)password+=randChar(chars);} output.value=password; renderMeter(root.querySelector('[data-passgen-meter]'),root.querySelector('[data-passgen-verdict]'),password);}\n\t\tfunction updateChecker(){var input=root.querySelector('[data-passcheck-input]'), value=input.value, info=renderMeter(root.querySelector('[data-passcheck-meter]'),root.querySelector('[data-passcheck-verdict]'),value), lengthOk=value.length>=12||info.parts>=3, varietyOk=info.variety>=3, commonOk=!info.common; if(!value){root.querySelector('[data-passcheck-verdict]').textContent='Start typing to check strength.';} root.querySelector('[data-check-rule=\"length\"]').classList.toggle('is-ok',lengthOk); root.querySelector('[data-check-rule=\"variety\"]').classList.toggle('is-ok',varietyOk); root.querySelector('[data-check-rule=\"common\"]').classList.toggle('is-ok',commonOk);}\n\t\tfunction shiftText(text,key,decode){var amount=(parseInt(key,10)||7)%26; if(decode)amount=26-amount; return text.replace(\/[A-Za-z]\/g,function(ch){var base=ch<='Z'?65:97; return String.fromCharCode(((ch.charCodeAt(0)-base+amount)%26)+base);});}\n\t\tfunction toBase64(text){return btoa(unescape(encodeURIComponent(text)));}\n\t\tfunction fromBase64(text){return decodeURIComponent(escape(atob(text)));}\n\t\tfunction numberCode(text,key){var offset=parseInt(key,10)||7; return Array.from(text).map(function(ch){return ch.codePointAt(0)+offset;}).join('-');}\n\t\tfunction numberDecode(text,key){var offset=parseInt(key,10)||7, parts=text.trim().split(\/[^0-9]+\/).filter(Boolean); return parts.map(function(item){return String.fromCodePoint(Math.max(0,parseInt(item,10)-offset));}).join('');}\n\t\tfunction blockEncode(text,key){var size=Math.max(2,Math.min(9,parseInt(key,10)||4)), out=''; for(var i=0;i<text.length;i+=size){out+=text.slice(i,i+size).split('').reverse().join('');} return out;}\n\t\tfunction fragmentEncode(text,count){var coded=toBase64(text), total=Math.max(2,Math.min(5,parseInt(count,10)||3)), size=Math.ceil(coded.length\/total), parts=[]; for(var i=0;i<total;i++){parts.push('SIL-'+(i+1)+'\/'+total+':'+coded.slice(i*size,(i+1)*size));} return parts.join('\\n');}\n\t\tfunction fragmentDecode(text){var lines=text.split(\/\\n+\/).map(function(line){return line.trim();}).filter(Boolean), parts=[], total=0; lines.forEach(function(line){var match=line.match(\/^SIL-(\\d+)\\\/(\\d+):(.+)$\/i); if(match){parts[parseInt(match[1],10)-1]=match[3]; total=parseInt(match[2],10);}}); if(!total||parts.filter(Boolean).length<total)throw new Error('Paste all labelled fragments to decode.'); return fromBase64(parts.join(''));}\n\t\tfunction updateCodeTool(){var action=codeField('action').value, method=codeField('method').value, key=codeField('key').value, input=root.querySelector('[data-code-input]').value, output=root.querySelector('[data-code-output]'), status=root.querySelector('[data-code-status]'), fragmentField=root.querySelector('[data-code-fragment-count]'), result=''; fragmentField.hidden=method!=='fragments'; if(!input){output.value=''; status.textContent='Choose a method and type something to encode or decode.'; return;} try{if(method==='shift')result=shiftText(input,key,action==='decode'); if(method==='numbers')result=action==='decode'?numberDecode(input,key):numberCode(input,key); if(method==='blocks')result=blockEncode(input,key); if(method==='fragments')result=action==='decode'?fragmentDecode(input):fragmentEncode(input,codeField('fragments').value); output.value=result; status.textContent=(action==='encode'?'Encoded':'Decoded')+' successfully. Use the same method and key to reverse it.';}catch(e){output.value=''; status.textContent=e.message||'Could not decode that input.';}}\n\t\troot.querySelector('[data-passgen-refresh]').addEventListener('click',generate);\n\t\troot.querySelector('[data-passgen-copy]').addEventListener('click',function(){var out=root.querySelector('[data-passgen-output]'); out.select(); if(navigator.clipboard){navigator.clipboard.writeText(out.value);} this.textContent='Copied'; var btn=this; window.setTimeout(function(){btn.textContent='Copy';},1100);});\n\t\troot.querySelectorAll('[data-passgen-field]').forEach(function(el){el.addEventListener('change',generate);});\n\t\troot.querySelector('[data-passcheck-input]').addEventListener('input',updateChecker);\n\t\troot.querySelector('[data-passcheck-show]').addEventListener('change',function(){root.querySelector('[data-passcheck-input]').type=this.checked?'text':'password';});\n\t\troot.querySelectorAll('[data-code-field]').forEach(function(el){el.addEventListener('change',updateCodeTool); el.addEventListener('input',updateCodeTool);});\n\t\troot.querySelector('[data-code-input]').addEventListener('input',updateCodeTool);\n\t\troot.querySelector('[data-code-copy]').addEventListener('click',function(){var out=root.querySelector('[data-code-output]'); out.select(); if(navigator.clipboard){navigator.clipboard.writeText(out.value);} this.textContent='Copied'; var btn=this; window.setTimeout(function(){btn.textContent='Copy';},1100);});\n\t\tgenerate(); updateChecker(); updateCodeTool();\n\t}());\n\t<\/script>\n\t\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-769","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false,"dgwt-wcas-product-suggestion":false},"uagb_author_info":{"display_name":"","author_link":"https:\/\/silcom.io\/author\/"},"uagb_comment_info":0,"uagb_excerpt":null,"_links":{"self":[{"href":"https:\/\/silcom.io\/wp-json\/wp\/v2\/pages\/769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/silcom.io\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/silcom.io\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/silcom.io\/wp-json\/wp\/v2\/comments?post=769"}],"version-history":[{"count":0,"href":"https:\/\/silcom.io\/wp-json\/wp\/v2\/pages\/769\/revisions"}],"wp:attachment":[{"href":"https:\/\/silcom.io\/wp-json\/wp\/v2\/media?parent=769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}