Skip to content
Back to skills

Detecting Weak Cryptography

ASecurity

Scan a source tree for weak cryptographic primitives: MD5 / SHA-1 used for security purposes, DES / 3DES / RC4 ciphers, ECB block mode, custom-built crypto (XOR loops, hand-rolled HMAC), hardcoded IVs, predictable random (Math.random / java.util.Random for crypto seeds), missing certificate verification (verify=False, rejectUnauthorized: false). Use when: pre-merge gate on crypto-touching code, audit before SOC2 / PCI assessment, post-incident review when "we found a weakness in our token sig...

  • 2,719 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 21, 2026
ai-agentspythongojavabashnodegitapisecurity

Works with

  • claude code
  • api

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 21, 2026

npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill detecting-weak-cryptography --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Detecting Weak Cryptography?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Detecting Weak Cryptography
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jeremylongshore-detecting-weak-cryptography-cf8d1a99/badge)](https://www.skillsdirectory.com/skills/jeremylongshore-detecting-weak-cryptography-cf8d1a99)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: detecting-weak-cryptography
description: |
  Scan a source tree for weak cryptographic primitives: MD5 / SHA-1
  used for security purposes, DES / 3DES / RC4 ciphers, ECB block
  mode, custom-built crypto (XOR loops, hand-rolled HMAC),
  hardcoded IVs, predictable random (Math.random / java.util.Random
  for crypto seeds), missing certificate verification
  (verify=False, rejectUnauthorized: false).
  Use when: pre-merge gate on crypto-touching code, audit before
  SOC2 / PCI assessment, post-incident review when "we found a
  weakness in our token signing."
  Threshold: any call to a known-weak algorithm with non-test
  context, OR cert verification explicitly disabled, OR a custom
  crypto loop pattern.
  Trigger with: "scan weak crypto", "find MD5 usage", "check ECB
  mode", "audit ssl verify", "weak random".
allowed-tools:
  - Read
  - Bash(python3:*)
  - Glob
  - Grep
disallowed-tools:
  - Bash(rm:*)
  - Bash(curl:*)
version: 3.30.0
author: Jeremy Longshore <jeremy@intentsolutions.io>
license: MIT
compatibility: Designed for Claude Code
tags:
  - security
  - static-analysis
  - cryptography
  - pentest
---

# Detecting Weak Cryptography

## Overview

Weak cryptography (CWE-327 Use of a Broken or Risky Cryptographic
Algorithm, CWE-330 Use of Insufficiently Random Values) shows up
when engineers use the convenient API instead of the cryptographic
one. `hashlib.md5(password)` is faster to type than the correct
bcrypt/argon2 invocation; `Math.random()` returns a number quickly
without needing to know about `crypto.randomBytes()`.

The fix is universal: use the modern primitive. SHA-256 for general
hashing, bcrypt/argon2/scrypt for passwords, AES-GCM for encryption,
HMAC-SHA256 for signing, `secrets` / `crypto.randomBytes` /
`SecureRandom` for randomness.

## When the skill produces findings

| Finding | Severity | Threshold | Affected control |
|---|---|---|---|
| MD5 used in security context | **HIGH** | hashlib.md5, MessageDigest.MD5, CryptoJS.MD5 | CWE-327 |
| SHA-1 used in security context | **HIGH** | hashlib.sha1, etc. | CWE-327 |
| DES / 3DES cipher | **CRITICAL** | DESCrypto, "DES/CBC", "DESede" | CWE-327 |
| RC4 cipher | **CRITICAL** | "ARC4", "RC4" | CWE-327 |
| AES ECB mode | **CRITICAL** | "AES/ECB" or `MODE_ECB` | CWE-327 |
| Hardcoded IV (initialization vector) | **CRITICAL** | IV literal in source | CWE-329 |
| Custom XOR-based "encryption" | **CRITICAL** | XOR loop over bytes | CWE-327 |
| Predictable random for crypto seed | **CRITICAL** | Math.random / java.util.Random / random.random for keys | CWE-330 |
| TLS cert verification disabled | **CRITICAL** | verify=False, rejectUnauthorized:false, ServerCertificateValidationCallback returning true | CWE-295 |
| Hardcoded HMAC secret | **HIGH** | Long literal in HMAC constructor | CWE-321 |
| Insecure password hashing (no salt, no KDF) | **CRITICAL** | hashlib.sha256(password) without bcrypt/argon2 | CWE-916 |

## Prerequisites

- Python 3.9+
- Source tree on local filesystem

## Instructions

### Run

```bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/detecting-weak-cryptography/scripts/scan_weak_crypto.py /path/to/repo
```

Options: `--output`, `--format`, `--min-severity`, `--include-tests`,
`--languages`, `--allow-md5-checksums` (excludes MD5 used in
non-security contexts like content-addressable storage).

### Interpret

CRITICAL = direct cryptographic break available against the
algorithm. CVEs, public attack tools, sometimes pre-computed
tables (rainbow tables for MD5/SHA-1).

HIGH = algorithm collision-broken (MD5, SHA-1) but the specific
use case may tolerate the weakness (file-deduplication checksums,
non-security HMAC). Verify the usage context.

### Remediation

See `references/PLAYBOOK.md` for per-primitive migration. Modern
defaults: SHA-256/SHA-3 for hashing, AES-256-GCM for encryption,
HMAC-SHA-256 for signing, secrets-grade random for keys, bcrypt /
argon2id for password storage.

## Examples

### Pre-merge gate

```bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/detecting-weak-cryptography/scripts/scan_weak_crypto.py \
    --min-severity high $(git diff --name-only main...HEAD | tr '\n' ' ')
```

### CI

```yaml
- name: Weak-crypto scan
  run: |
    python3 plugins/security/penetration-tester/skills/detecting-weak-cryptography/scripts/scan_weak_crypto.py \
        . --min-severity high
```

## Output

JSON / JSONL / Markdown. Exit codes: 0 / 1 / 2.

## Error Handling

False positives common on:

- MD5 used for content-addressable storage (caches, content hashes)
  where collision resistance against ATTACKERS isn't needed — use
  `--allow-md5-checksums`.
- HMAC-MD5 — broken against adversaries but acceptable as an
  integrity check inside a TLS session where the channel is
  already authenticated.

Verify each finding by reading whether the algorithm's failure
mode (collision, preimage, etc.) is actually exploitable in
context.

## Resources

- `references/THEORY.md` — Per-primitive attack model (why MD5 /
  SHA-1 are collision-broken, why ECB leaks structure, why
  Math.random is non-crypto-grade)
- `references/PLAYBOOK.md` — Per-language modern-crypto recipes
  (Python cryptography library, Node crypto, Java JCA with
  modern algorithms, Go crypto/rand + crypto/cipher AEAD)

Files in this skill

  • SKILL.md5.1 KB
  • references/PLAYBOOK.md10.2 KB
  • references/THEORY.md7.3 KB
  • scripts/scan_weak_crypto.py14.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.