<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kokal Limited</title>
    <description>The latest articles on DEV Community by Kokal Limited (@kokal_limited_b7d45823e1d).</description>
    <link>https://dev.to/kokal_limited_b7d45823e1d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4012892%2F19bdc8f3-7850-4def-acac-33d0c3fdb145.png</url>
      <title>DEV Community: Kokal Limited</title>
      <link>https://dev.to/kokal_limited_b7d45823e1d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kokal_limited_b7d45823e1d"/>
    <language>en</language>
    <item>
      <title>Are Browser Password Managers Safe in 2026?</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Tue, 25 Aug 2026 05:19:07 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/are-browser-password-managers-safe-in-2026-knj</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/are-browser-password-managers-safe-in-2026-knj</guid>
      <description>&lt;p&gt;Failed to authenticate. API Error: 401 OAuth access token has been revoked.&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>BestPasswordGenerator.org vs SecureKeyGenerator.com: Which Free Generator Should You Use in 2026?</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Sun, 23 Aug 2026 05:18:55 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/bestpasswordgeneratororg-vs-securekeygeneratorcom-which-free-generator-should-you-use-in-2026-fe4</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/bestpasswordgeneratororg-vs-securekeygeneratorcom-which-free-generator-should-you-use-in-2026-fe4</guid>
      <description>&lt;p&gt;Failed to authenticate. API Error: 401 OAuth access token has been revoked.&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Strong Password Generators: What Actually Makes a Password Secure?</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Tue, 11 Aug 2026 05:18:51 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/strong-password-generators-what-actually-makes-a-password-secure-5b3d</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/strong-password-generators-what-actually-makes-a-password-secure-5b3d</guid>
      <description>&lt;p&gt;Most people have already been breached and don't know it. The 2023 Verizon DBIR found that &lt;strong&gt;86% of data breaches involve stolen or weak credentials&lt;/strong&gt; — making password hygiene the single highest-leverage security improvement most users can make.&lt;/p&gt;

&lt;p&gt;And yet "P@ssw0rd1!" still passes most strength checkers. Here's what actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Problem: Human Bias
&lt;/h2&gt;

&lt;p&gt;Humans are terrible at generating random strings. We pick patterns, keyboard walks, and dictionary words with symbols bolted on. A proper strong password generator removes that bias entirely by using a &lt;strong&gt;Cryptographically Secure Pseudorandom Number Generator (CSPRNG)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the browser, that means the Web Crypto API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generatePassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;charset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&amp;amp;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint32Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRandomValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This draws entropy from the OS random pool — the same source used in TLS key generation. Crucially, &lt;strong&gt;each character is statistically independent of the last&lt;/strong&gt;, which is what makes the output unpredictable. Contrast this with &lt;code&gt;Math.random()&lt;/code&gt;, which is seeded and deterministic — never use it for security-sensitive output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Length Beats Complexity Every Time
&lt;/h2&gt;

&lt;p&gt;This is the result most people find counterintuitive. Here's estimated brute-force cracking time against a modern GPU cluster at 10B guesses/sec (via Hive Systems 2024):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Length&lt;/th&gt;
&lt;th&gt;Character Set&lt;/th&gt;
&lt;th&gt;Est. Crack Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Lowercase only&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Full mixed&lt;/td&gt;
&lt;td&gt;8 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Full mixed&lt;/td&gt;
&lt;td&gt;3,000 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Full mixed&lt;/td&gt;
&lt;td&gt;1 billion years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Full mixed&lt;/td&gt;
&lt;td&gt;Practically infinite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A 12-character fully mixed password is already strong by any practical measure. At 16+ characters, you're in "heat death of the universe" territory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Trustworthy Generator Looks Like
&lt;/h2&gt;

&lt;p&gt;When evaluating or building one, check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client-side only&lt;/strong&gt; — no password is transmitted over a network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSPRNG&lt;/strong&gt; — &lt;code&gt;window.crypto.getRandomValues()&lt;/code&gt; in browsers, &lt;code&gt;secrets&lt;/code&gt; module in Python, &lt;code&gt;crypto/rand&lt;/code&gt; in Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable&lt;/strong&gt; — length and character set should be user-controlled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No logging&lt;/strong&gt; — the output is never stored or cached
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;alphabet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ascii_letters&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;punctuation&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alphabet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Stop optimizing for "looks complex." Optimize for length and genuine randomness. A 16-character password from a CSPRNG-backed generator is astronomically harder to crack than any 8-character pattern a human would invent — no matter how many &lt;code&gt;!&lt;/code&gt; symbols you add.&lt;/p&gt;

&lt;p&gt;Use a password manager, generate 16+ character passwords for everything, and let the entropy do its job.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;StrongPassFactory&lt;/a&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>What Makes a Password Actually Good (A Developer's Guide to Entropy)</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:26:55 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/what-makes-a-password-actually-good-a-developers-guide-to-entropy-36b7</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/what-makes-a-password-actually-good-a-developers-guide-to-entropy-36b7</guid>
      <description>&lt;p&gt;We've all built a signup form and slapped a regex on the password field: "at least 8 characters, one uppercase, one number, one symbol." It feels rigorous. It's mostly theater.&lt;/p&gt;

&lt;p&gt;The problem is that complexity rules optimize for the wrong thing. &lt;code&gt;P@ssw0rd!&lt;/code&gt; satisfies every checkbox above and is one of the first strings any cracking dictionary tries. What actually matters is &lt;strong&gt;entropy&lt;/strong&gt; — the number of guesses an attacker needs on average.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entropy, briefly
&lt;/h2&gt;

&lt;p&gt;Entropy scales with the size of the character pool and the length of the password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bits = length × log2(pool_size)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 8-character password from the full ASCII printable set (~95 chars) gives you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8 × log2(95) ≈ 52 bits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 16-character lowercase-only passphrase (&lt;code&gt;correcthorsebatterystaple&lt;/code&gt;-style)?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;16 × log2(26) ≈ 75 bits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Longer-but-simpler beats shorter-but-gnarly. Every character you add multiplies the search space; every extra symbol class only adds a bit or two. This is why length is the single highest-leverage variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "good" actually means
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High entropy&lt;/strong&gt; — aim for 70+ bits for anything that matters. That's roughly 12+ random characters or 5+ random words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Truly random&lt;/strong&gt; — generated by a CSPRNG, not picked by a human. Humans cluster around dates, keyboard walks, and &lt;code&gt;l33t&lt;/code&gt; substitutions that crackers model well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unique per site&lt;/strong&gt; — reuse turns one breach into many. This is non-negotiable, which is why a password manager isn't optional.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Generate them right
&lt;/h2&gt;

&lt;p&gt;Don't hand-roll &lt;code&gt;Math.random()&lt;/code&gt; — it isn't cryptographically secure. Use your platform's CSPRNG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Node.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomInt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CHARS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&amp;amp;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;CHARS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;randomInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CHARS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)]).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// e.g. "kR8$mZ2!qWfN...@vT4"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a memorable-but-strong passphrase, pull random words from a wordlist (Diceware-style) using the same CSPRNG.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Stop enforcing symbol soup on your users. Set a generous minimum length, encourage a password manager, check submissions against known-breach lists (the &lt;a href="https://haveibeenpwned.com/API/v3" rel="noopener noreferrer"&gt;HaveIBeenPwned range API&lt;/a&gt; is free and k-anonymized), and let entropy do the heavy lifting.&lt;/p&gt;

&lt;p&gt;Good passwords aren't clever. They're long, random, and unique — and ideally you never see them, because a generator made them for you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>How to Create a Secure Password: A 7-Step Guide for Developers</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Fri, 07 Aug 2026 13:19:31 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/how-to-create-a-secure-password-a-7-step-guide-for-developers-5ae7</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/how-to-create-a-secure-password-a-7-step-guide-for-developers-5ae7</guid>
      <description>&lt;p&gt;Weak credentials are still one of the easiest ways into a company's systems. If you write auth code, ship apps, or just want to stop reusing the same password everywhere, here's a practical 7-step approach to building passwords that actually hold up.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Go long before you go complex
&lt;/h2&gt;

&lt;p&gt;Length beats complexity. Entropy scales with length, so a 20-character passphrase crushes an 8-character string of symbols. Aim for &lt;strong&gt;16+ characters&lt;/strong&gt; minimum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Weak (short, predictable substitutions)
P@ssw0rd!

# Strong (long passphrase)
correct-horse-battery-staple-42-quartz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Use a generator, not your brain
&lt;/h2&gt;

&lt;p&gt;Humans are terrible entropy sources. Let the machine do it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 32-char random password from the CLI&lt;/span&gt;
openssl rand &lt;span class="nt"&gt;-base64&lt;/span&gt; 24

&lt;span class="c"&gt;# Or with Python&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import secrets; print(secrets.token_urlsafe(24))"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;secrets&lt;/code&gt;, never &lt;code&gt;random&lt;/code&gt; — the latter isn't cryptographically secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. One password per account
&lt;/h2&gt;

&lt;p&gt;Credential stuffing works because people reuse passwords. A breach at one service becomes a master key everywhere else. Unique credentials contain the blast radius to a single account.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Store them in a password manager
&lt;/h2&gt;

&lt;p&gt;You can't memorize 100 unique 32-character strings, and you shouldn't try. A password manager (Bitwarden, 1Password, KeePassXC) encrypts everything behind one strong master password. For teams, this is non-negotiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Turn on 2FA — prefer hardware keys
&lt;/h2&gt;

&lt;p&gt;A password is one factor. Add a second:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best:&lt;/strong&gt; hardware security key (FIDO2/WebAuthn) — phishing-resistant by design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Good:&lt;/strong&gt; TOTP authenticator app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid:&lt;/strong&gt; SMS codes (SIM-swappable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building auth, support WebAuthn. It kills phishing in a way OTPs can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Never hardcode or commit secrets
&lt;/h2&gt;

&lt;p&gt;The strongest password is worthless in a public repo. Keep credentials out of source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env — and add it to .gitignore&lt;/span&gt;
&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;generated-secret&amp;gt;

&lt;span class="c"&gt;# Scan before you push&lt;/span&gt;
git secrets &lt;span class="nt"&gt;--scan&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a vault (HashiCorp Vault, AWS Secrets Manager) for anything production.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Rotate on compromise, not on a calendar
&lt;/h2&gt;

&lt;p&gt;Forced 90-day rotation trains users to pick weak, incremental passwords (&lt;code&gt;Spring2026!&lt;/code&gt; → &lt;code&gt;Summer2026!&lt;/code&gt;). Modern guidance (NIST SP 800-63B) says: rotate when there's evidence of compromise, and monitor breach databases like Have I Been Pwned instead.&lt;/p&gt;




&lt;p&gt;Strong passwords aren't about clever symbol swaps — they're about length, uniqueness, good storage, and a second factor. Bake these defaults into your projects and your users inherit the security for free.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Password Apps Every Small Business Needs in 2026</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Wed, 05 Aug 2026 13:19:31 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/password-apps-every-small-business-needs-in-2026-ilm</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/password-apps-every-small-business-needs-in-2026-ilm</guid>
      <description>&lt;p&gt;If you ship software for a living, you already know the drill: the weakest link in your security isn't your code, it's the &lt;code&gt;admin/admin123&lt;/code&gt; login someone on the ops team is still using in production. For small businesses without a dedicated security team, the right password tooling is the cheapest insurance you can buy.&lt;/p&gt;

&lt;p&gt;Here's a developer-friendly breakdown of what actually matters in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A team password manager (non-negotiable)
&lt;/h2&gt;

&lt;p&gt;Bitwarden, 1Password, and Vaultwarden (self-hosted) all support CLI access, which is what makes them worth it for devs. You can pull secrets into scripts without hardcoding them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Fetch a secret at runtime instead of committing it&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;bw get password &lt;span class="s2"&gt;"prod-postgres"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
psql &lt;span class="nt"&gt;-h&lt;/span&gt; db.internal &lt;span class="nt"&gt;-U&lt;/span&gt; app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more &lt;code&gt;.env&lt;/code&gt; files floating around Slack.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A password generator with real entropy
&lt;/h2&gt;

&lt;p&gt;Skip the "correct horse battery staple" jokes and generate high-entropy secrets programmatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 32-char password, URL-safe&lt;/span&gt;
openssl rand &lt;span class="nt"&gt;-base64&lt;/span&gt; 24

&lt;span class="c"&gt;# Or with Python&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import secrets; print(secrets.token_urlsafe(32))"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For non-technical teammates, a hosted generator works fine — just make sure it runs client-side and never transmits the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Hardware keys for anything that matters
&lt;/h2&gt;

&lt;p&gt;Software 2FA is good; phishing-resistant hardware 2FA is better. A &lt;strong&gt;YubiKey 5 NFC&lt;/strong&gt; or a FIDO2-certified security key stops credential-stuffing attacks cold because the auth is bound to the origin. If an attacker phishes the token, it's useless on their fake domain.&lt;/p&gt;

&lt;p&gt;For SSH, you can back your keys with a resident FIDO2 credential:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519-sk &lt;span class="nt"&gt;-O&lt;/span&gt; resident &lt;span class="nt"&gt;-O&lt;/span&gt; verify-required
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your private key literally cannot be exfiltrated from the laptop — it lives on the hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Secret scanning in CI
&lt;/h2&gt;

&lt;p&gt;Password hygiene isn't just storage — it's catching leaks before they merge. Add a scanner to your pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/scan.yml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Scan for secrets&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gitleaks/gitleaks-action@v2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Tool type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared credentials&lt;/td&gt;
&lt;td&gt;Team password manager (CLI-capable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong secrets&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;openssl&lt;/code&gt; / &lt;code&gt;secrets&lt;/code&gt; / hosted generator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phishing-proof 2FA&lt;/td&gt;
&lt;td&gt;FIDO2 hardware key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leak prevention&lt;/td&gt;
&lt;td&gt;CI secret scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You don't need an enterprise budget to get 90% of the protection an enterprise has. You need a manager, a generator, a hardware key, and a scanner in CI — most of which are free or under $50.&lt;/p&gt;

&lt;p&gt;Lock it down before someone else does it for you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;StrongPassFactory&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>How to Change a Password Correctly: A Developer's Guide for Small Teams</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Fri, 31 Jul 2026 14:38:45 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/how-to-change-a-password-correctly-a-developers-guide-for-small-teams-27e1</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/how-to-change-a-password-correctly-a-developers-guide-for-small-teams-27e1</guid>
      <description>&lt;p&gt;Changing a password sounds trivial—click "forgot password," type a new one, done. But if you run infrastructure for a small business or team, doing it &lt;em&gt;correctly&lt;/em&gt; matters more than doing it fast. A sloppy password rotation can lock out services, break automation, or leave old credentials floating around in logs and config files.&lt;/p&gt;

&lt;p&gt;Here's how to do it right.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Don't Just Change It—Rotate It
&lt;/h2&gt;

&lt;p&gt;A password change should assume the old one is already compromised. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invalidate active sessions after the change&lt;/li&gt;
&lt;li&gt;Revoke API tokens or app passwords tied to the old credential&lt;/li&gt;
&lt;li&gt;Check for the password hardcoded in scripts, &lt;code&gt;.env&lt;/code&gt; files, or CI secrets
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick sweep for a leaked password string in your repo&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"OldP@ssw0rd"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.env"&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.yml"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it shows up anywhere in version control, rotating the password isn't enough—you'll want to scrub the history too.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Generate, Don't Invent
&lt;/h2&gt;

&lt;p&gt;Humans are bad at randomness. Let a tool do it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 20-char high-entropy password&lt;/span&gt;
openssl rand &lt;span class="nt"&gt;-base64&lt;/span&gt; 20

&lt;span class="c"&gt;# Or with a password manager CLI&lt;/span&gt;
op item create &lt;span class="nt"&gt;--category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;login &lt;span class="nt"&gt;--generate-password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'letters,digits,symbols,32'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aim for length over complexity. A 20+ character random string beats &lt;code&gt;P@ssw0rd!&lt;/code&gt; every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Update Everywhere It Lives
&lt;/h2&gt;

&lt;p&gt;The most common failure isn't a weak password—it's a &lt;em&gt;stale&lt;/em&gt; one. When you rotate a shared credential, update:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The password manager (single source of truth)&lt;/li&gt;
&lt;li&gt;CI/CD secrets and environment variables&lt;/li&gt;
&lt;li&gt;Any service accounts or cron jobs that authenticate with it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Enforce It as Policy
&lt;/h2&gt;

&lt;p&gt;For a small team, tooling beats memory. Push everyone onto a shared password manager, require MFA, and stop forcing arbitrary 90-day resets—NIST guidance now recommends changing passwords only when there's evidence of compromise, not on a fixed timer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;A correct password change is a small workflow: rotate the assumption of compromise, generate high entropy, propagate everywhere, and back it with MFA. Do that consistently and password hygiene stops being a fire drill.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Building a Password Policy for a Small Dev Team (2026 Edition)</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:18:51 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/building-a-password-policy-for-a-small-dev-team-2026-edition-20i5</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/building-a-password-policy-for-a-small-dev-team-2026-edition-20i5</guid>
      <description>&lt;p&gt;You've got five people. Nobody owns "IT." One dev still uses &lt;code&gt;Password1!&lt;/code&gt; for the CRM, and someone shared a login with a contractor over email last week. Your whole stack sits behind the weakest credential on the team.&lt;/p&gt;

&lt;p&gt;Small teams face enterprise-grade threats on a hobbyist budget. The Verizon 2026 DBIR found that &lt;strong&gt;43% of cyberattacks target small businesses&lt;/strong&gt;, and stolen credentials are still the top attack vector (53% of breaches). For teams of 10 or fewer, IBM puts the average credential-breach cost at &lt;strong&gt;$98,000&lt;/strong&gt;. A written, followed password policy is the cheapest defense you have.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the policy actually needs
&lt;/h3&gt;

&lt;p&gt;Here's the 2026 baseline vs. what you should ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Old minimum&lt;/th&gt;
&lt;th&gt;2026 recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;8 chars&lt;/td&gt;
&lt;td&gt;12+ chars (NIST SP 800-63B)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Mixed types&lt;/td&gt;
&lt;td&gt;Drop composition rules — favor length&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Mandatory, all accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expiry&lt;/td&gt;
&lt;td&gt;Every 90 days&lt;/td&gt;
&lt;td&gt;Only on known compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password manager&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Mandatory, company-wide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breach checks&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Auto-check against HIBP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared creds&lt;/td&gt;
&lt;td&gt;Allowed&lt;/td&gt;
&lt;td&gt;Forbidden — use secure sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both NIST and NCSC dropped mandatory periodic rotation. A 15-character passphrase beats a &lt;code&gt;P@ssw0rd!&lt;/code&gt; that ends up on a sticky note.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pick your infrastructure first
&lt;/h3&gt;

&lt;p&gt;Tools before rules. For a small team that means a shared password manager + MFA everywhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password manager:&lt;/strong&gt; Bitwarden Teams or 1Password Business, ~$3–4/user/month. Shared vaults, secure sharing, breach monitoring. Keeper Business is worth a look if you're under HIPAA/PCI-DSS/ISO 27001.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA:&lt;/strong&gt; Non-negotiable on anything internet-facing. Google/Microsoft Authenticator are free; Duo has a free tier up to 10 users with wide app integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enforce it in code, not vibes
&lt;/h3&gt;

&lt;p&gt;Don't just write "12+ characters" in a wiki — validate it. A quick example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_strong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_pwned&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sha&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sha&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.pwnedpasswords.com/range/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HIBP range API uses k-anonymity — you only send the first 5 hash chars, never the password. Wire this into signup and password-reset flows so weak or breached credentials never make it in.&lt;/p&gt;

&lt;h3&gt;
  
  
  The rules employees actually follow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;12+ characters, generated by the manager (nobody memorizes them)&lt;/li&gt;
&lt;li&gt;MFA on every account, no exceptions&lt;/li&gt;
&lt;li&gt;No shared logins — use the vault's sharing feature&lt;/li&gt;
&lt;li&gt;Rotate only on a known breach&lt;/li&gt;
&lt;li&gt;Run quarterly audits and a short onboarding walkthrough&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A policy is only as good as its enforcement. Automate the checks, make the secure path the easy path, and revisit it every quarter.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>What Devs Should Learn From the Dashlane Brute-Force Attack</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:03:14 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/what-devs-should-learn-from-the-dashlane-brute-force-attack-4b0i</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/what-devs-should-learn-from-the-dashlane-brute-force-attack-4b0i</guid>
      <description>&lt;p&gt;On &lt;strong&gt;May 31, 2026&lt;/strong&gt;, Dashlane got hit with a coordinated brute-force attack that locked thousands of users — including team-plan customers — out of their vaults during work hours. Dashlane &lt;a href="https://www.bleepingcomputer.com" rel="noopener noreferrer"&gt;confirmed to BleepingComputer&lt;/a&gt; that automated controls suspended targeted accounts. No internal systems were breached, and accounts were restored. But if your team depends on a password manager, this is worth a look.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual attack vector: credential stuffing
&lt;/h2&gt;

&lt;p&gt;The attack wasn't some exotic zero-day. It was &lt;strong&gt;credential stuffing&lt;/strong&gt; — replaying leaked email/password pairs against a high-value login endpoint. It works because of one stubborn human habit: password reuse.&lt;/p&gt;

&lt;p&gt;Attackers pull credential pairs from breach dumps and script them against a target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Conceptually, what an attacker's loop looks like
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;leaked_credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://vault.example.com/login&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;log_hit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# reused password → account compromised
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per Verizon's 2024 DBIR, &lt;strong&gt;43% of cyberattacks target small businesses&lt;/strong&gt;, and only 14% are prepared. A locked password manager isn't a minor annoyance — it means no access to shared vaults, client creds, or infra secrets mid-incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defense: what you can actually configure
&lt;/h2&gt;

&lt;p&gt;If you administer a team plan, MFA enforcement is the single highest-leverage control. Credential stuffing dies instantly when a second factor is required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The policy posture you want on any team password manager&lt;/span&gt;
&lt;span class="na"&gt;mfa&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enforcement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required&lt;/span&gt;      &lt;span class="c1"&gt;# not "optional"&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;totp&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;webauthn&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# prefer hardware/WebAuthn over SMS&lt;/span&gt;
&lt;span class="na"&gt;lockout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin-configurable&lt;/span&gt; &lt;span class="c1"&gt;# not vendor-locked&lt;/span&gt;
  &lt;span class="na"&gt;admin_override&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;       &lt;span class="c1"&gt;# someone can unlock a locked-out director&lt;/span&gt;
&lt;span class="na"&gt;audit_logging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;full&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consumer plans give you vendor-defined lockout and optional MFA. Business tiers (1Password Teams, Keeper Business, LastPass Business) let you &lt;em&gt;mandate&lt;/em&gt; MFA, configure lockout, and unlock accounts as an admin.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist for engineers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enforce MFA&lt;/strong&gt; — prefer WebAuthn/TOTP over SMS. This alone neutralizes credential stuffing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document recovery&lt;/strong&gt; — designate a backup admin who can override lockouts. Don't let one locked account halt the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit reused passwords&lt;/strong&gt; — run your team through &lt;a href="https://haveibeenpwned.com" rel="noopener noreferrer"&gt;Have I Been Pwned&lt;/a&gt; or your manager's built-in breach report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate-limit your own login endpoints&lt;/strong&gt; — if you ship auth, the same attack applies to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The uncomfortable takeaway: even a well-built password manager can be knocked offline by attackers weaponizing &lt;em&gt;your users'&lt;/em&gt; reused passwords. MFA and a documented recovery path are what keep a Tuesday-morning attack from becoming a Tuesday-morning outage.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;StrongPassFactory&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>The 10-Minute Offboarding Checklist Every Dev Team Ignores</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:09:17 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/the-10-minute-offboarding-checklist-every-dev-team-ignores-1m5k</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/the-10-minute-offboarding-checklist-every-dev-team-ignores-1m5k</guid>
      <description>&lt;p&gt;When an employee leaves, how fast can you kill their access? If it's not "under 10 minutes," you have a problem.&lt;/p&gt;

&lt;p&gt;In our analysis of SMB security incidents this year, failure to revoke former-employee access was the root cause of &lt;strong&gt;34% of preventable breaches&lt;/strong&gt; — more than phishing, more than weak passwords. The Verizon 2026 DBIR pegs 28% of breaches on internal actors, and ex-employees with live credentials are a big slice of that.&lt;/p&gt;

&lt;p&gt;These failures are quiet and boring. No zero-day, no APT — just a token nobody rotated. Which is exactly why they're so preventable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it breaks in small teams
&lt;/h2&gt;

&lt;p&gt;Enterprises wire HRIS into their IdP, so termination auto-deactivates accounts. Most of us run manual processes that fall apart under pressure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No account inventory&lt;/strong&gt; — 20+ SaaS subscriptions and nobody knows who has access to what.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSO blind spots&lt;/strong&gt; — you kill the IdP, but they signed up for three tools directly with a personal-looking email, bypassing SSO entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared vault chaos&lt;/strong&gt; — if they owned the team password vault, revoking them can lock everyone out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API keys and PATs&lt;/strong&gt; — the scariest one for devs. Personal access tokens keep working long after the human is gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The NCSC measures the risk window in &lt;em&gt;hours, not days&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core checklist
&lt;/h2&gt;

&lt;p&gt;Run these in order, starting the minute notice is given:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Disable the identity provider account first (Entra ID / Google Workspace / Okta)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Revoke ALL active sessions — invalidate live tokens, don't just reset the password&lt;/span&gt;
gcloud identity ... &lt;span class="c"&gt;# or your IdP's "sign out everywhere"&lt;/span&gt;

&lt;span class="c"&gt;# 3. Rotate the shared vault master + any secrets they could read&lt;/span&gt;
&lt;span class="c"&gt;# 4. Remove from every SaaS app individually (CRM, billing, PM, email)&lt;/span&gt;

&lt;span class="c"&gt;# 5. Kill API keys and personal access tokens — check every provider&lt;/span&gt;
gh auth status              &lt;span class="c"&gt;# audit GitHub PATs&lt;/span&gt;
aws iam list-access-keys &lt;span class="nt"&gt;--user-name&lt;/span&gt; former.employee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passwords are polite; &lt;strong&gt;session and token revocation is what actually locks the door.&lt;/strong&gt; A disabled account with a live OAuth token is still an open door.&lt;/p&gt;

&lt;p&gt;Automate what you can. Even a simple runbook — a checklist in your wiki with owners assigned per step — beats scrambling under emotional pressure the day someone gets walked out.&lt;/p&gt;

&lt;p&gt;The goal isn't enterprise tooling. It's a repeatable process you can run in 10 minutes, every single time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Insider Threat Detection: SMB Password Policies That Actually Work</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Sat, 25 Jul 2026 13:05:33 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/insider-threat-detection-smb-password-policies-that-actually-work-125n</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/insider-threat-detection-smb-password-policies-that-actually-work-125n</guid>
      <description>&lt;p&gt;When we think about security threats, we default to the external attacker — ransomware, phishing, brute-force bots. But according to the Verizon 2025 DBIR, &lt;strong&gt;insider threats account for 34% of breaches&lt;/strong&gt; in small and medium businesses. And the top attack vector? Abused or mismanaged passwords.&lt;/p&gt;

&lt;p&gt;The good news: you don't need a SOC to defend against this. You need sane password policies and a few controls wired into your credential workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three kinds of insider
&lt;/h2&gt;

&lt;p&gt;Not every insider is malicious. Knowing the category tells you which control to reach for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Malicious&lt;/strong&gt; — departing staff or contractors intentionally misusing access (exfiltrating a customer DB before resignation). IBM pegs the average cost at ~£210k per incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negligent&lt;/strong&gt; — well-meaning people bypassing policy for convenience: passwords in Slack, credentials in a shared spreadsheet, no logout on shared machines. This is the biggest bucket — &lt;strong&gt;56% of insider incidents&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compromised&lt;/strong&gt; — an attacker operating under a real employee's stolen identity. NCSC attributes &lt;strong&gt;72%&lt;/strong&gt; of detected UK SMB insider incidents to compromised credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Controls that map to real attack patterns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Just-in-time (JIT) privileged access.&lt;/strong&gt; Stop granting permanent admin. Issue elevated credentials that expire on a timer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: time-boxed elevation policy&lt;/span&gt;
&lt;span class="na"&gt;grant&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db-admin&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alice@company.com&lt;/span&gt;
  &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30m&lt;/span&gt;          &lt;span class="c1"&gt;# auto-revoke after 30 minutes&lt;/span&gt;
  &lt;span class="na"&gt;approval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required&lt;/span&gt;
  &lt;span class="na"&gt;audit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Credential check-in / check-out.&lt;/strong&gt; Shared accounts (vendor portals, social logins, admin consoles) should live in a vault that logs access and blocks concurrent use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[vault] alice checked OUT vendor-portal @ 14:02
[vault] bob requested vendor-portal → QUEUED (in use)
[vault] alice checked IN vendor-portal  @ 14:19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Automated offboarding.&lt;/strong&gt; Every departure should trigger a revocation workflow — rotate any shared secrets the person touched, kill their sessions, and confirm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Offboarding hook (pseudo)&lt;/span&gt;
revoke_sessions &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
rotate_shared_secrets &lt;span class="nt"&gt;--touched-by&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
disable_sso &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; notify_admin &lt;span class="s2"&gt;"offboarded: &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;p&gt;None of these require expensive tooling — most business password managers support JIT and check-in/check-out out of the box. The pattern is the same each time: &lt;strong&gt;short-lived credentials, logged access, and automatic revocation.&lt;/strong&gt; You reduce the blast radius of a malicious insider, remove the shortcuts a negligent one relies on, and shrink the window a compromised account stays useful.&lt;/p&gt;

&lt;p&gt;Start with a baseline password policy, layer these three controls on top, and you've covered the vast majority of insider-driven breaches without hiring a security team.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>MFA for SMBs in 2026: A Developer's Quick-Start Guide</title>
      <dc:creator>Kokal Limited</dc:creator>
      <pubDate>Thu, 23 Jul 2026 13:03:26 +0000</pubDate>
      <link>https://dev.to/kokal_limited_b7d45823e1d/mfa-for-smbs-in-2026-a-developers-quick-start-guide-1poi</link>
      <guid>https://dev.to/kokal_limited_b7d45823e1d/mfa-for-smbs-in-2026-a-developers-quick-start-guide-1poi</guid>
      <description>&lt;p&gt;If you build or maintain systems for a small business, multi-factor authentication (MFA) is the single highest-leverage security control you can ship. The Verizon 2026 DBIR found that &lt;strong&gt;81% of breaches involve stolen or weak passwords&lt;/strong&gt; — and MFA neutralizes most of those attacks even when credentials leak.&lt;/p&gt;

&lt;p&gt;Here's the developer's-eye view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Passwords fail because people reuse them. When a third-party service gets breached, attackers run credential-stuffing against your login endpoint. MFA adds a second factor that makes automated attacks economically pointless. IBM's Cost of a Data Breach 2026 report showed SMBs with MFA on all accounts cut breach costs by &lt;strong&gt;67%&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick the right factor
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MFA Type&lt;/th&gt;
&lt;th&gt;Security&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS codes&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Fallback only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOTP apps&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Most SMB accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push notifications&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;£2-5/user/mo&lt;/td&gt;
&lt;td&gt;Simple approval flows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware keys (FIDO2)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;£25-50 once&lt;/td&gt;
&lt;td&gt;Admin &amp;amp; financial access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passkeys (multi-device FIDO)&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Passwordless future&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Skip SMS as a primary factor — NIST SP 800-63B no longer recommends it thanks to SIM-swap attacks (the UK NCSC logged a &lt;strong&gt;340% jump&lt;/strong&gt; in 2025).&lt;/p&gt;

&lt;h2&gt;
  
  
  TOTP is the sweet spot
&lt;/h2&gt;

&lt;p&gt;Time-based one-time passwords work offline, cost nothing, and are trivial to integrate. If you're on Node, most of the work is one library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;authenticator&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;otplib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Generate a per-user secret at enrollment&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authenticator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateSecret&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Build the otpauth:// URI for the QR code&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authenticator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keyuri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YourApp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Verify the 6-digit code on login&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authenticator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store &lt;code&gt;secret&lt;/code&gt; encrypted at rest, render &lt;code&gt;uri&lt;/code&gt; as a QR code (Google Authenticator, Authy, 2FAS all scan it), and gate the session on &lt;code&gt;isValid&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;strong&gt;backup codes&lt;/strong&gt; → users get locked out and disable MFA.&lt;/li&gt;
&lt;li&gt;Verifying tokens without a &lt;strong&gt;replay window&lt;/strong&gt; or rate limit.&lt;/li&gt;
&lt;li&gt;Storing TOTP secrets in plaintext.&lt;/li&gt;
&lt;li&gt;Treating SMS as your primary factor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything privileged — admin panels, payment systems — step up to FIDO2/WebAuthn hardware keys. They're phishing-resistant in a way TOTP isn't.&lt;/p&gt;

&lt;p&gt;Ship MFA before you ship the next feature. It's the cheapest security win you'll get all year.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://strongpassfactory.com" rel="noopener noreferrer"&gt;strongpassfactory.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>passwordsecurity</category>
      <category>onlinesafety</category>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
