AUTH-009critical SeverityBroken Authentication & Access Controls

Passwords Hashed with Argon2 or Bcrypt (Minimum 10 Rounds)

Custom auth code written by AI sometimes uses SHA256 or MD5 hashes without salt instead of standard password hashing algorithms.

1-Click Fix Prompt for Cursor & Claude Code
Review my codebase for "Passwords Hashed with Argon2 or Bcrypt (Minimum 10 Rounds)" (AUTH-009).
Issue: Custom auth code written by AI sometimes uses SHA256 or MD5 hashes without salt instead of standard password hashing algorithms.
Remediation required: Use bcrypt or Argon2id with adequate work factors for password hashing, or delegate entirely to Supabase/Clerk.

Please:
1. Locate any occurrences of this issue across my repository.
2. Refactor the code to follow production standards without breaking existing functionality.
3. Provide a clear command or step to test and verify the fix.

Why AI Assistants Write This Bug

Custom auth code written by AI sometimes uses SHA256 or MD5 hashes without salt instead of standard password hashing algorithms.

AI code generation prioritizes immediate syntax execution over production edge cases. When an assistant hits an undefined variable or strict type error, it frequently takes the path of least resistance rather than implementing standard pre-launch security patterns.

Code Comparison

Common AI Code PatternVulnerable
// Vulnerable AI-generated pattern for: Passwords Hashed with Argon2 or Bcrypt (Minimum 10 Rounds)
// Insecure route handler trusting body user ID (IDOR risk)
export async function POST(req: Request) {
  const { userId, newEmail } = await req.json();
  // BUG: Any user can modify any other user record!
  await db.user.update({ where: { id: userId }, data: { email: newEmail } });
  return Response.json({ success: true });
}
Launch-Ready Fix
// Production-ready fix for: Passwords Hashed with Argon2 or Bcrypt (Minimum 10 Rounds)
// Protected route deriving identity from verified session
export async function POST(req: Request) {
  const session = await auth();
  if (!session?.user?.id) {
    return Response.json({ error: "Unauthorized" }, { status: 401 });
  }
  const { newEmail } = await req.json();
  // Scoped strictly to authenticated session user ID
  await db.user.update({ where: { id: session.user.id }, data: { email: newEmail } });
  return Response.json({ success: true });
}

Remediation & Verification Checklist

Remediation: Use bcrypt or Argon2id with adequate work factors for password hashing, or delegate entirely to Supabase/Clerk.
  1. Search your codebase for pattern matching "Passwords Hashed with Argon2 or Bcrypt (Minimum 10 Rounds)".
  2. Apply the recommended remediation: Use bcrypt or Argon2id with adequate work factors for password hashing, or delegate entirely to Supabase/Clerk.
  3. Run local build and test commands to ensure no regressions.
  4. Verify in your browser or with curl that the issue is resolved.
Audit All 108 Checks in One Click

Checking items one by one takes hours. Let us do it in 2 minutes.

With the Founder Pass ($15 one-time), we automatically scan your repository for this issue, plus all other 107 launch checks across secrets, Stripe webhooks, Supabase RLS, and security headers.