<?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: Shreya Dutta</title>
    <description>The latest articles on DEV Community by Shreya Dutta (@arceuzvx).</description>
    <link>https://dev.to/arceuzvx</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2957949%2F109d19b0-0afc-4632-91af-540a11f84aa1.jpg</url>
      <title>DEV Community: Shreya Dutta</title>
      <link>https://dev.to/arceuzvx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arceuzvx"/>
    <language>en</language>
    <item>
      <title>Syncing a Private GitHub Repo to a Public Org Repo with GitHub Actions (and the auth trap nobody tells you about)</title>
      <dc:creator>Shreya Dutta</dc:creator>
      <pubDate>Sun, 31 May 2026 17:11:49 +0000</pubDate>
      <link>https://dev.to/arceuzvx/syncing-a-private-github-repo-to-a-public-org-repo-with-github-actions-and-the-auth-trap-nobody-3i00</link>
      <guid>https://dev.to/arceuzvx/syncing-a-private-github-repo-to-a-public-org-repo-with-github-actions-and-the-auth-trap-nobody-3i00</guid>
      <description>&lt;p&gt;I recently set up a CI/CD pipeline for &lt;a href="https://github.com/ArceonSec/tracehawk" rel="noopener noreferrer"&gt;TraceHawk&lt;/a&gt; — my DevSecOps scanner project under the &lt;a href="https://github.com/ArceonSec" rel="noopener noreferrer"&gt;ArceonSec&lt;/a&gt; GitHub org.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal was simple&lt;/strong&gt;: dev happens in a private repo, and when code reaches prod, it automatically syncs to the public org repo.&lt;/p&gt;

&lt;p&gt;Simple in theory. Two hours of PAT hell in practice 🙄&lt;/p&gt;

&lt;p&gt;Here's everything I learned so you don't have to.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Three branches in the private repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;main&lt;/strong&gt; — active development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;staging&lt;/strong&gt; — CI checks run here (Ruff, Docker build, Gitleaks, Semgrep, health check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;prod&lt;/strong&gt; — triggers automatic sync to the public ArceonSec org repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The public org repo (&lt;code&gt;ArceonSec/tracehawk&lt;/code&gt;) only has &lt;code&gt;main&lt;/code&gt; and always mirrors &lt;code&gt;prod&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nobody commits there directly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also because I am the only member :')&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Workflow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sync To Public Repository&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sync-to-public&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;Sync Prod To ArceonSec&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;timeout-minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
    &lt;span class="na"&gt;environment&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;production&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&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;Checkout Repository&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;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&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;Configure Git&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "GitHub Actions"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "actions@github.com"&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;Remove Default Auth Header&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git config --local --unset-all "http.https://github.com/.extraheader"&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;Add Public Repository Remote&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git remote add arceon \&lt;/span&gt;
          &lt;span class="s"&gt;https://x-access-token:${{ secrets.ARCEON_PAT }}@github.com/ArceonSec/tracehawk.git&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;Push Prod Branch To Public Main&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git push arceon prod:main --force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks straightforward.&lt;/p&gt;

&lt;p&gt;It &lt;em&gt;wasn't&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap #1 — The Auth Header Override
&lt;/h2&gt;

&lt;p&gt;This one got me the hardest.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;actions/checkout&lt;/code&gt; sets a local Git config header called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http.https://github.com/.extraheader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with the default &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; authorization.&lt;/p&gt;

&lt;p&gt;This happens silently in the background.&lt;/p&gt;

&lt;p&gt;When you add a second remote and try to push using your PAT, GitHub Actions still uses this default header — effectively ignoring your PAT entirely.&lt;/p&gt;

&lt;p&gt;The push fails with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;remote: Permission to ArceonSec/tracehawk.git denied to github-actions[bot].
fatal: unable to access: 403
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Unset the header before pushing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--local&lt;/span&gt; &lt;span class="nt"&gt;--unset-all&lt;/span&gt; &lt;span class="s2"&gt;"http.https://github.com/.extraheader"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this before adding the remote.&lt;/p&gt;

&lt;p&gt;This was the root cause of most of my pain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap #2 — PAT Scopes
&lt;/h2&gt;

&lt;p&gt;You need exactly two scopes on your Classic PAT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;repo&lt;/code&gt; — to push to the org repo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;workflow&lt;/code&gt; — because your repository contains &lt;code&gt;.github/workflows/&lt;/code&gt; files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without &lt;code&gt;workflow&lt;/code&gt;, GitHub blocks the push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;refusing to allow a Personal Access Token to create or update workflow
without `workflow` scope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Add the &lt;code&gt;workflow&lt;/code&gt; scope and regenerate the token.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap #3 — Org PAT Access
&lt;/h2&gt;

&lt;p&gt;If you're pushing to an organization repository, the org must allow PAT access.&lt;/p&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.com/organizations/YOUR_ORG/settings/personal-access-tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classic PATs&lt;/li&gt;
&lt;li&gt;Fine-grained PATs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are allowed.&lt;/p&gt;

&lt;p&gt;Some organizations restrict PAT access by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap #4 — Environment Secrets vs Repository Secrets
&lt;/h2&gt;

&lt;p&gt;I used a production environment block:&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="na"&gt;environment&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;production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changes where GitHub looks for secrets.&lt;/p&gt;

&lt;p&gt;Instead of repository secrets, GitHub now checks environment secrets.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;ARCEON_PAT&lt;/code&gt; exists only as a repository secret, the workflow won't find it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the secret to the environment&lt;/li&gt;
&lt;li&gt;Remove the environment block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I kept the environment block because it allows deployment protection rules later.&lt;/p&gt;




&lt;h2&gt;
  
  
  The PAT Setup (Correct Way)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a Classic PAT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub
→ Settings
→ Developer Settings
→ Personal Access Tokens
→ Tokens (classic)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scopes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo&lt;/li&gt;
&lt;li&gt;workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Allow PAT Access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Organization Settings
→ Personal Access Tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure PAT access is allowed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Add the Secret
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Private Repo
→ Settings
→ Environments
→ production
→ Add Secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARCEON_PAT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Full Branch Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main (dev)
    ↓ manual merge when ready

staging
    ↓ CI runs
    ↓ Ruff
    ↓ Docker build
    ↓ Gitleaks
    ↓ Semgrep
    ↓ Health check

prod
    ↓ sync workflow fires

ArceonSec/tracehawk (main)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dev stays private.&lt;/p&gt;

&lt;p&gt;Public repo stays clean and presentable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why &lt;code&gt;--force&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Since ArceonSec is a pure mirror, &lt;code&gt;prod&lt;/code&gt; should always win.&lt;/p&gt;

&lt;p&gt;If histories diverge (for example, someone manually pushes to the public repo), a normal push gets rejected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push arceon prod:main &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is safe here &lt;strong&gt;as long as nobody commits directly to the mirror repository.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which they shouldn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  All Checks Passed &amp;lt;3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fone7twa7lh0qwjnp6w9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fone7twa7lh0qwjnp6w9n.png" alt="All checks passed &amp;lt;3" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;happy noises&lt;/em&gt; 🦅🦅🦅&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Unset the default auth header before pushing to another repository&lt;/li&gt;
&lt;li&gt;✅ PAT needs &lt;code&gt;repo&lt;/code&gt; + &lt;code&gt;workflow&lt;/code&gt; scopes&lt;/li&gt;
&lt;li&gt;✅ Allow PAT access in organization settings&lt;/li&gt;
&lt;li&gt;✅ Put the secret in the correct location (environment secret if using &lt;code&gt;environment:&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Never commit directly to the mirror repository&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Took me two hours to figure out.&lt;/p&gt;

&lt;p&gt;Should take you five minutes now :)&lt;/p&gt;




&lt;p&gt;Thanks for reading :&amp;gt;&lt;/p&gt;

&lt;p&gt;Chat with me on &lt;a href="//x.com/arceuzvx"&gt;X/Twitter&lt;/a&gt; :)&lt;/p&gt;

</description>
      <category>devops</category>
      <category>githubactions</category>
      <category>cicd</category>
      <category>github</category>
    </item>
    <item>
      <title>How Strong Is Dropbox Password Security? Real Password Crack Time Analysis Using Modern GPU Models</title>
      <dc:creator>Shreya Dutta</dc:creator>
      <pubDate>Sun, 08 Feb 2026 06:33:31 +0000</pubDate>
      <link>https://dev.to/arceuzvx/how-strong-is-dropbox-password-security-real-password-crack-time-analysis-using-modern-gpu-models-41fl</link>
      <guid>https://dev.to/arceuzvx/how-strong-is-dropbox-password-security-real-password-crack-time-analysis-using-modern-gpu-models-41fl</guid>
      <description>&lt;p&gt;Hey everyone 👋🏻 I’m Shreya, a Computer Science student with cyber security as a specialization, exploring the various areas in Information Security. Today’s blog covers password policy analysis with Dropbox as a case study.&lt;/p&gt;

&lt;h2&gt;
  
  
  Password Policy Analysis — Dropbox
&lt;/h2&gt;

&lt;p&gt;Password policy (Observed + Documented behavior):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;At least 8 characters&lt;br&gt;
Encourages letters, numbers, symbols (UI driven strength feedback)&lt;br&gt;
Pattern / common password detection (not just character rules)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8rqhtyrc705qhvsqtbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8rqhtyrc705qhvsqtbl.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Though it doesn’t meet the &lt;em&gt;12 character&lt;/em&gt; requirement like many newer orgs these days, &lt;em&gt;8 characters is pretty much the minimum baseline&lt;/em&gt; still accepted across many platforms. Modern security guidance is slowly pushing toward &lt;em&gt;12–16+ characters&lt;/em&gt; as safer defaults.&lt;/p&gt;

&lt;p&gt;Industry reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 = legacy baseline&lt;/li&gt;
&lt;li&gt;10–12 = modern baseline&lt;/li&gt;
&lt;li&gt;14–16 = strong modern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also to note, there’s &lt;em&gt;no strict Upper/Lower case enforcement rule&lt;/em&gt; publicly documented, which can look like a drawback from a traditional complexity-rule viewpoint, but modern systems often prefer &lt;em&gt;entropy + pattern detection&lt;/em&gt; instead of forcing predictable complexity substitutions.&lt;/p&gt;

&lt;p&gt;Dropbox actually uses password strength detection that compares passwords against common words, names, patterns and numbers to prevent easy-to-guess passwords.&lt;/p&gt;

&lt;p&gt;For more info: &lt;a href="https://help.dropbox.com/security/password-control" rel="noopener noreferrer"&gt;https://help.dropbox.com/security/password-control&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dropbox also recommends longer passwords, unique passwords per service, and enabling 2FA or passkeys for stronger protection.&lt;br&gt;
Here: &lt;a href="https://help.dropbox.com/security/secure-password" rel="noopener noreferrer"&gt;https://help.dropbox.com/security/secure-password&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passwords to Test&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;password_123&lt;/li&gt;
&lt;li&gt;bluey#1996&lt;/li&gt;
&lt;li&gt;bg@1996_dropbox&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Detailed Explanation For Why Each Password Will Eventually Be Cracked
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1️⃣ password_123
&lt;/h3&gt;

&lt;p&gt;Very common password variant of this being “password123” has been in pretty much every password leak databases for years now, so this variant will also be cracked easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdlubhoo6qz83xjmikw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdlubhoo6qz83xjmikw1.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attack reality:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This would likely be cracked instantly using credential stuffing or breach database matching, not brute force.&lt;/p&gt;


&lt;h3&gt;
  
  
  2️⃣ bluey#1996
&lt;/h3&gt;

&lt;p&gt;Identical to email/first name plus 1996 could highly mean their birth year.&lt;br&gt;&lt;br&gt;
A little digging about the person’s identity and boom you have it all with all possible variants with name/birthdate etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0um3al57xqbt32ugjerl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0um3al57xqbt32ugjerl.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attack reality:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This is classic OSINT-derivable password construction.&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ bg@1996_dropbox
&lt;/h3&gt;

&lt;p&gt;Abbreviation of name + year + website they’re signing up for along with 2 special characters.&lt;br&gt;&lt;br&gt;
Slightly better than last 2 but still very predictable as it’s a combo of name/DOB/website. Still not secure enough.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl5fr0k67gf5dsh7g7bo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl5fr0k67gf5dsh7g7bo.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attack reality:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Attackers specifically test service-name + year + initials combos.&lt;/p&gt;


&lt;h2&gt;
  
  
  Crack Time Testing
&lt;/h2&gt;

&lt;p&gt;Went a step ahead and checked how long it’ll take hackers with modern tools to crack the above three.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1cp2vz04s0cqgkamlh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1cp2vz04s0cqgkamlh2.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5rqvb2btzayzrxa03yp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5rqvb2btzayzrxa03yp.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxksg6jfaj8kg3g4lz0jr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxksg6jfaj8kg3g4lz0jr.png" alt=" " width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First 2 → under 1 sec
&lt;/li&gt;
&lt;li&gt;Third → ~8 hrs
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Important Context
&lt;/h3&gt;

&lt;p&gt;These tools estimate brute-force cracking assuming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No prior knowledge
&lt;/li&gt;
&lt;li&gt;No breach database
&lt;/li&gt;
&lt;li&gt;No OSINT
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real attackers usually try:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leaks
&lt;/li&gt;
&lt;li&gt;Pattern mutations
&lt;/li&gt;
&lt;li&gt;OSINT guessing
&lt;/li&gt;
&lt;li&gt;Then brute force
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can try it on:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.mypasswordchecker.com/" rel="noopener noreferrer"&gt;https://www.mypasswordchecker.com/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  4th Password — Password Manager Style
&lt;/h2&gt;

&lt;p&gt;I’d like to take a 4th password for the analysis, something that Google password manager would suggest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XFu2&amp;amp;3fM^Tm&amp;amp;&amp;amp;2#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks like sci-fi but let’s see:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbkbk6d8spcgxdbm3omx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbkbk6d8spcgxdbm3omx.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It does say very strong but modern GPUs can theoretically crack it in &amp;lt;12 days (pure brute force estimate assuming high compute resources).&lt;/p&gt;




&lt;h3&gt;
  
  
  Real-World Note
&lt;/h3&gt;

&lt;p&gt;Without:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breach exposure
&lt;/li&gt;
&lt;li&gt;Password reuse
&lt;/li&gt;
&lt;li&gt;Offline hash cracking
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attackers are unlikely to brute force something like this unless extremely high value target scenario.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Looks like we need to step up the password game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Modern Direction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Longer passwords / passphrases
&lt;/li&gt;
&lt;li&gt;Unique per service
&lt;/li&gt;
&lt;li&gt;Password manager usage
&lt;/li&gt;
&lt;li&gt;MFA / Passkeys
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Extra Real-World Security Context
&lt;/h2&gt;

&lt;p&gt;Modern password strength systems don’t just check symbols. They check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common password lists
&lt;/li&gt;
&lt;li&gt;Human language patterns
&lt;/li&gt;
&lt;li&gt;Keyboard patterns
&lt;/li&gt;
&lt;li&gt;Known leaks
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Research shows machine learning models can now learn real human password behavior from leak datasets and improve password guessing success significantly.&lt;/p&gt;

&lt;p&gt;Also, password strength meters themselves can leak pattern info or be gamed if poorly designed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cool Research Papers to Explore
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Human Password Modeling Research&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2407.14145" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2407.14145&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Password Strength Meter Risks Research&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2505.08292" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2505.08292&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Password Entropy Theory&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2404.16853" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2404.16853&lt;/a&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  NOTE
&lt;/h3&gt;

&lt;p&gt;Most accounts are NOT hacked via brute force.&lt;/p&gt;

&lt;p&gt;Most are compromised via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Password reuse
&lt;/li&gt;
&lt;li&gt;Phishing
&lt;/li&gt;
&lt;li&gt;Malware / infostealers
&lt;/li&gt;
&lt;li&gt;Credential stuffing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passwords are slowly becoming just one layer of authentication.&lt;/p&gt;




&lt;p&gt;Hope you liked the write-up 🙂&lt;br&gt;&lt;br&gt;
Follow up in &lt;a href="https://x.com/arceuzvx" rel="noopener noreferrer"&gt;X / Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>webdev</category>
      <category>web</category>
    </item>
  </channel>
</rss>
