cisco-hashgen


Namecisco-hashgen JSON
Version 2.0.1 PyPI version JSON
download
home_pageNone
SummaryGenerate and verify Cisco-compatible password hashes for Cisco ASA & IOS/IOS-XE.
upload_time2025-08-14 05:24:50
maintainerNone
docs_urlNone
authorGilbert Mendoza
requires_python>=3.8
licenseNone
keywords cisco asa ios pbkdf2 password security networking router switch firewall
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # cisco-hashgen

[![PyPI version](https://img.shields.io/pypi/v/cisco-hashgen.svg)](https://pypi.org/project/cisco-hashgen/)
[![Python versions](https://img.shields.io/pypi/pyversions/cisco-hashgen.svg)](https://pypi.org/project/cisco-hashgen/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![CI](https://github.com/Krontab/cisco-hashgen/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Krontab/cisco-hashgen/actions/workflows/ci.yml)

<!-- Enable this once downloads look healthy :)
[![Downloads](https://static.pepy.tech/badge/cisco-hashgen)](https://pepy.tech/project/cisco-hashgen)
-->

> Generate and verify Cisco-compatible password hashes for Cisco ASA & IOS/IOS-XE.

**cisco-hashgen** supports the generation and verification of the following formats:

- **Cisco ASA (PBKDF2-SHA512)** → `$sha512$<iter>$B64(salt)$B64(dk16)`
- **Cisco IOS/IOS-XE Type 5** (MD5-crypt) → `$1$<salt>$<hash>`
- **Cisco IOS/IOS-XE Type 8** (PBKDF2-SHA256) → `$8$<Cisco64(salt)>$<Cisco64(dk32)>`
- **Cisco IOS/IOS-XE Type 9** (scrypt) → `$9$<Cisco64(salt)>$<Cisco64(dk32)>`

## Capabilities

- Generate password hashes discretely in a masked (non-echoing) terminal session.
- Generate hashes offline and embed them in config templates.
- Piped input/output for easy integration with other tools like [pass](https://www.passwordstore.org/), [ansible-vault](https://docs.ansible.com/ansible/latest/user_guide/vault.html), or [GitHub Actions](https://docs.github.com/en/actions/security-guides/encrypted-secrets).
- Securely read passwords from the command line, shell, or environment variables.
- Securely read passwords from the macOS Keychain.
- Verify existing hashes offline without touching the device. (audit mode, brute force)

## Why this exists

1) **Generate Cisco-compatible hashes from any system**  
   - Now you don't have to have a Cisco switch or router to generate hashes.  
2) **Bootstrap device configs without plaintext passwords**
   - Pre-generate hashes offline and embed them in config templates.   
   - No more storing or echoing the clear text password.
3) **Verify existing hashes offline**  
   - Check if a password matches a Cisco hash without touching the device.
   - Script out the verification process of many password hashes looking for matches. 
4) **Shoulder surfing and screen share privacy**
   - Generate a valid hash with cisco-hashgen which masks your input by default. 
   - All you see is the hash which you paste into your config or command line.

> 💡 Hashes are only as strong as the password and parameters. Prefer long, random passphrases; keep iteration counts at Cisco defaults (or higher where supported); and protect generated hashes like any credential artifact.

## ⚠️ Cautions
- Hashes produced by this tool ***should*** be able to be used on many Cisco switches, routers, and firewalls but ***please*** test thoroughly before using in production.
- This tool does not support Type 1, 2, 3, 4, or 6. (yet)

## 🚀 Quick Install

**Recommended:** Use [pipx](https://pipx.pypa.io/) to install in an isolated environment.
This avoids dependency conflicts and works the same on Linux, macOS, and Windows.

### Ubuntu / Debian
```text
sudo apt update
sudo apt install pipx
pipx ensurepath
pipx install cisco-hashgen
```

### macOS (Homebrew)
```text
brew install pipx
pipx ensurepath
pipx install cisco-hashgen
```

### Windows (PowerShell)
```powershell
python -m pip install --user pipx
python -m pipx ensurepath
pipx install cisco-hashgen
```

### Verify installation
```text
cisco-hashgen --help
```

> 💡 If you cannot use pipx, you can still install with:
```text
# Linux/macOS
python3 -m pip install --user cisco-hashgen

# Windows
python -m pip install --user cisco-hashgen

# On Debian/Ubuntu you may need:
python3 -m pip install --user cisco-hashgen --break-system-packages
```

## Quick start

### Generate ASA (PBKDF2-SHA512)
Default operation is interactive password input (password is masked)

```text
~ >> cisco-hashgen -asa
Cisco HashGen v2.0.1rc2 — Generate and verify Cisco-compatible hashes
  ASA PBKDF2-SHA512 defaults: iterations=5000, salt-bytes=16
  IOS/IOS-XE Type 5 (MD5-crypt)
  IOS/IOS-XE Type 8 PBKDF2-SHA256 defaults: iterations=20000, salt-bytes=10
  IOS/IOS-XE Type 9 (scrypt) defaults: N=16384, r=1, p=1, salt-bytes=10
  Validation: minlen=8, maxlen=1024

[Generating ASA PBKDF2-SHA512 hash]
Enter password: ********
Retype to confirm: ********
$sha512$5000$ICO3MWp5LADdvY85gGkqYA==$kji0GEgm5nHqKum7VmoY/w==
```
>💡 Note: cisco-hashgen defaults to -asa output, but you can specify -asa for clarity.

### Generate IOS/IOS-XE Type 9 (ASCII Salt) and use hash in configuration
```text
~ >> cisco-hashgen -ios9 -ios9-salt-mode ascii -quiet
Enter password: ********
Retype to confirm: ********
$9$cFiaINGxv8Gp4U$qG0lKpyM56WpYvZ1B2IY8LX6fInUsHs5NmRbVpyqHDQ

# From Cisco device
switch1#configure terminal
switch1(config)#username admin secret 9 $9$cFiaINGxv8Gp4U$qG0lKpyM56WpYvZ1B2IY8LX6fInUsHs5NmRbVpyqHDQ
```

### Verify a hash (auto-detects hash type!) 
```text
>> cisco-hashgen -v '$sha512$5000$ICO3MWp5LADdvY85gGkqYA==$kji0GEgm5nHqKum7VmoY/w=='
[Verifying ASA PBKDF2-SHA512 hash]
[Enter password to verify against ASA PBKDF2-SHA512]
Enter password to verify: ********
[+] Password matches.
```

### One-liner verify (stdin + -v) - Insecure / Password is visible
```text
echo 'My S3cr3t!' | cisco-hashgen -v '$8$HxHoQOhOgadA7E==$HjROgK8oWfeM45/EHbOwxCC328xBBYz2IF2BevFOSok=' 
[Verifying IOS/IOS-XE Type 8 PBKDF2-SHA256 hash]
[+] Password matches.
```
> 💡 This above example illustrates the tool's flexibility for stdin/stdout. When executed this way, the password is displayed on screen and likely saved in the terminal history or process list. See more secure methods below.

## Supplying passwords securely

### A) Interactive (masked, safest)
```text
cisco-hashgen -asa
```

### B) Shell read (no secret in history)
```text
read -rs PW && printf '%s' "$PW" | cisco-hashgen -asa -quiet && unset PW
# or use env var:
read -rs PW && CISCO_HASHGEN_PWD="$PW" cisco-hashgen -ios8 -env CISCO_HASHGEN_PWD -quiet && unset PW
```

### C) macOS Keychain (GUI → CLI)
1. Open **Keychain Access** → add a new password item (e.g., Service: `HASHGEN_PW`).
2. Use it without revealing plaintext:
```text
security find-generic-password -w -s HASHGEN_PW | cisco-hashgen -asa -quiet
```
3. Remove later with: `security delete-generic-password -s HASHGEN_PW`

### D) pass (Password Store)
```text
brew install pass gnupg
gpg --quick-generate-key "Your Name <you@example.com>" default default never
gpg --list-secret-keys --keyid-format LONG
pass init <YOUR_LONG_KEY_ID>

pass insert -m network/asa/admin <<'EOF'
Str0ngP@ss!
EOF

pass show network/asa/admin | head -n1 | cisco-hashgen -ios8 -v
```

### E) CI secret environment variable (GitHub Actions)
```yaml
- name: Generate ASA hash
  env:
    CISCO_HASHGEN_PWD: ${{ secrets.CISCO_HASHGEN_PWD }}
  run: |
    cisco-hashgen -asa -env CISCO_HASHGEN_PWD -quiet > hash.txt
```

## Quoting cheatsheet (very important)

- Always **single-quote** `$sha512...` / `$8$...` hashes to avoid `$` expansion:
  ```text
  cisco-hashgen -v '$sha512$5000$...$...'
  ```
- For passwords with spaces or shell characters, prefer interactive input, `read -rs`, Keychain, or `pass`.
- If you must put a password on the command line (not recommended), single-quote it; if it contains a single quote, use:
  ```text
  'pa'"'"'ss'
  ```

## CLI

```text
cisco-hashgen -h
usage: cisco-hashgen [-h] [-asa | -ios5 | -ios8 | -ios9] [-verify HASH] [-iter ITER] [-salt-bytes SALT_BYTES]
                     [--ios9-salt-mode {cisco64,ascii,stdb64}] [-minlen MINLEN] [-maxlen MAXLEN] [-pwd STRING]
                     [-env VAR] [-quiet] [-no-color] [-no-prompt] [-V] [-ios9-debug]
```

### options
- `-h, --help` — show this help message and exit
- `-asa` — Generate ASA PBKDF2 (SHA-512) hash (default).
- `-ios5` — Generate IOS/IOS-XE Type 5 (MD5-crypt) hash.
- `-ios8` — Generate IOS/IOS-XE Type 8 (PBKDF2-SHA256) hash.
- `-ios9` — Generate IOS/IOS-XE Type 9 (scrypt) hash.
- `-verify, -v HASH` — Verify a password against an existing hash.
- `-iter ITER` — Override iterations (default: ASA=5000, IOS8=20000).
- `-salt-bytes SALT_BYTES` — Override salt length in bytes (default: ASA=16, IOS8=10, IOS9=10).
- `-ios9-debug` — Enable maximum IOS9 verify diagnostics
- `-ios9-salt-mode` `{cisco64, ascii, stdb64}` — IOS9 salt field mode.  
  - **cisco64** (default) stores Cisco64 text and uses decoded bytes for KDF.
  - **ascii** stores Cisco64 text but uses the literal ASCII text for KDF;
  - **stdb64** stores StdBase64 text and uses that literal ASCII for KDF.
- `-minlen MINLEN` — Minimum password length (default: 8).
- `-maxlen MAXLEN` — Maximum password length (default: 1024).
- `-pwd STRING` — Password provided directly (quote if it contains spaces/shell chars).
- `-env VAR` — Read password from environment variable VAR.
- `-quiet` — Suppress banners and extra output (script-friendly).
- `-no-color` — Disable ANSI colors in help/banners.
- `-no-prompt` — Fail if no password is provided via stdin/-pwd/-env (no interactive prompt).
- `-V, --version` — show program's version number and exit

## Exit codes
- `0` — Success / verified match  
- `1` — Verify mismatch  
- `2` — Unsupported/invalid hash format  
- `3` — Password validation error  
- `4` — No password provided and `-no-prompt` set  
- `130` — User interrupted (Ctrl-C)

## Technical notes

- **ASA**: PBKDF2-HMAC-SHA512; iterations stored; salt Base64; **first 16 bytes** of DK stored.  
  _Why it matters_: Only a portion of the derived key is stored, so reproducing the hash requires exact PBKDF2 parameters and truncation behavior.

- **IOS/IOS-XE Type 5**: MD5-based crypt (`md5crypt`); 1000 iterations (fixed); salt up to 8 chars; Cisco Base64 alphabet (`./0..9A..Za..z`).  
  _Why it matters_: Legacy format, still seen on older systems; uses a fixed iteration count and short salts, making it less secure but widely compatible.

- **IOS/IOS-XE Type 8**: PBKDF2-HMAC-SHA256; **20000** iterations (fixed); salt 10 bytes; Cisco Base64 alphabet (`./0..9A..Za..z`).  
  _Why it matters_: Modern, strong PBKDF2 with fixed parameters; hash reproduction must match iteration count exactly.

- **IOS/IOS-XE Type 9 – Canonical**: scrypt (N=16384, r=1, p=1); salt 14 bytes; Cisco Base64 alphabet (`./0..9A..Za..z`).  
  _Why it matters_: Strongest Cisco hash; requires exact scrypt parameters and binary salt encoding for compatibility.

- **IOS/IOS-XE Type 9 – ASCII Salt**: scrypt (N=16384, r=1, p=1); salt literal ASCII (non-canonical but accepted by some platforms); salt length 14 chars; Cisco Base64 alphabet for hash output only.  
  _Why it matters_: Some devices expect ASCII salt rather than binary; essential for login compatibility on these picky systems.

- **IOS/IOS-XE Type 9 – Mixed Salt**: scrypt (N=16384, r=1, p=1); salt may contain printable ASCII + Cisco64 characters (non-canonical); length still 14; Cisco Base64 alphabet for hash output.  
  _Why it matters_: Rare variant; sometimes seen when salts are generated inconsistently; necessary to replicate for exact hash matching.

## Supported Platforms
- Python 3.8+ (tested on 3.8–3.13)  
- macOS / Linux / Windows

## License
Cisco-Hashgen is available under the MIT license. See the LICENSE file for details.
Author: Gilbert Mendoza

## Changelog
See the [docs/releases](docs/releases/) folder for complete version history, or visit the [GitHub Releases](https://github.com/Krontab/cisco-hashgen/releases) page.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "cisco-hashgen",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "Cisco, ASA, IOS, PBKDF2, password, security, networking, router, switch, firewall",
    "author": "Gilbert Mendoza",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/03/aa/0a27f877505740c79e1c628c841f20fc1779ab6e5a4d84f88071278a92b8/cisco_hashgen-2.0.1.tar.gz",
    "platform": null,
    "description": "# cisco-hashgen\n\n[![PyPI version](https://img.shields.io/pypi/v/cisco-hashgen.svg)](https://pypi.org/project/cisco-hashgen/)\n[![Python versions](https://img.shields.io/pypi/pyversions/cisco-hashgen.svg)](https://pypi.org/project/cisco-hashgen/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![CI](https://github.com/Krontab/cisco-hashgen/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Krontab/cisco-hashgen/actions/workflows/ci.yml)\n\n<!-- Enable this once downloads look healthy :)\n[![Downloads](https://static.pepy.tech/badge/cisco-hashgen)](https://pepy.tech/project/cisco-hashgen)\n-->\n\n> Generate and verify Cisco-compatible password hashes for Cisco ASA & IOS/IOS-XE.\n\n**cisco-hashgen** supports the generation and verification of the following formats:\n\n- **Cisco ASA (PBKDF2-SHA512)** \u2192 `$sha512$<iter>$B64(salt)$B64(dk16)`\n- **Cisco IOS/IOS-XE Type 5** (MD5-crypt) \u2192 `$1$<salt>$<hash>`\n- **Cisco IOS/IOS-XE Type 8** (PBKDF2-SHA256) \u2192 `$8$<Cisco64(salt)>$<Cisco64(dk32)>`\n- **Cisco IOS/IOS-XE Type 9** (scrypt) \u2192 `$9$<Cisco64(salt)>$<Cisco64(dk32)>`\n\n## Capabilities\n\n- Generate password hashes discretely in a masked (non-echoing) terminal session.\n- Generate hashes offline and embed them in config templates.\n- Piped input/output for easy integration with other tools like [pass](https://www.passwordstore.org/), [ansible-vault](https://docs.ansible.com/ansible/latest/user_guide/vault.html), or [GitHub Actions](https://docs.github.com/en/actions/security-guides/encrypted-secrets).\n- Securely read passwords from the command line, shell, or environment variables.\n- Securely read passwords from the macOS Keychain.\n- Verify existing hashes offline without touching the device. (audit mode, brute force)\n\n## Why this exists\n\n1) **Generate Cisco-compatible hashes from any system**  \n   - Now you don't have to have a Cisco switch or router to generate hashes.  \n2) **Bootstrap device configs without plaintext passwords**\n   - Pre-generate hashes offline and embed them in config templates.   \n   - No more storing or echoing the clear text password.\n3) **Verify existing hashes offline**  \n   - Check if a password matches a Cisco hash without touching the device.\n   - Script out the verification process of many password hashes looking for matches. \n4) **Shoulder surfing and screen share privacy**\n   - Generate a valid hash with cisco-hashgen which masks your input by default. \n   - All you see is the hash which you paste into your config or command line.\n\n> \ud83d\udca1 Hashes are only as strong as the password and parameters. Prefer long, random passphrases; keep iteration counts at Cisco defaults (or higher where supported); and protect generated hashes like any credential artifact.\n\n## \u26a0\ufe0f Cautions\n- Hashes produced by this tool ***should*** be able to be used on many Cisco switches, routers, and firewalls but ***please*** test thoroughly before using in production.\n- This tool does not support Type 1, 2, 3, 4, or 6. (yet)\n\n## \ud83d\ude80 Quick Install\n\n**Recommended:** Use [pipx](https://pipx.pypa.io/) to install in an isolated environment.\nThis avoids dependency conflicts and works the same on Linux, macOS, and Windows.\n\n### Ubuntu / Debian\n```text\nsudo apt update\nsudo apt install pipx\npipx ensurepath\npipx install cisco-hashgen\n```\n\n### macOS (Homebrew)\n```text\nbrew install pipx\npipx ensurepath\npipx install cisco-hashgen\n```\n\n### Windows (PowerShell)\n```powershell\npython -m pip install --user pipx\npython -m pipx ensurepath\npipx install cisco-hashgen\n```\n\n### Verify installation\n```text\ncisco-hashgen --help\n```\n\n> \ud83d\udca1 If you cannot use pipx, you can still install with:\n```text\n# Linux/macOS\npython3 -m pip install --user cisco-hashgen\n\n# Windows\npython -m pip install --user cisco-hashgen\n\n# On Debian/Ubuntu you may need:\npython3 -m pip install --user cisco-hashgen --break-system-packages\n```\n\n## Quick start\n\n### Generate ASA (PBKDF2-SHA512)\nDefault operation is interactive password input (password is masked)\n\n```text\n~ >> cisco-hashgen -asa\nCisco HashGen v2.0.1rc2 \u2014 Generate and verify Cisco-compatible hashes\n  ASA PBKDF2-SHA512 defaults: iterations=5000, salt-bytes=16\n  IOS/IOS-XE Type 5 (MD5-crypt)\n  IOS/IOS-XE Type 8 PBKDF2-SHA256 defaults: iterations=20000, salt-bytes=10\n  IOS/IOS-XE Type 9 (scrypt) defaults: N=16384, r=1, p=1, salt-bytes=10\n  Validation: minlen=8, maxlen=1024\n\n[Generating ASA PBKDF2-SHA512 hash]\nEnter password: ********\nRetype to confirm: ********\n$sha512$5000$ICO3MWp5LADdvY85gGkqYA==$kji0GEgm5nHqKum7VmoY/w==\n```\n>\ud83d\udca1 Note: cisco-hashgen defaults to -asa output, but you can specify -asa for clarity.\n\n### Generate IOS/IOS-XE Type 9 (ASCII Salt) and use hash in configuration\n```text\n~ >> cisco-hashgen -ios9 -ios9-salt-mode ascii -quiet\nEnter password: ********\nRetype to confirm: ********\n$9$cFiaINGxv8Gp4U$qG0lKpyM56WpYvZ1B2IY8LX6fInUsHs5NmRbVpyqHDQ\n\n# From Cisco device\nswitch1#configure terminal\nswitch1(config)#username admin secret 9 $9$cFiaINGxv8Gp4U$qG0lKpyM56WpYvZ1B2IY8LX6fInUsHs5NmRbVpyqHDQ\n```\n\n### Verify a hash (auto-detects hash type!) \n```text\n>> cisco-hashgen -v '$sha512$5000$ICO3MWp5LADdvY85gGkqYA==$kji0GEgm5nHqKum7VmoY/w=='\n[Verifying ASA PBKDF2-SHA512 hash]\n[Enter password to verify against ASA PBKDF2-SHA512]\nEnter password to verify: ********\n[+] Password matches.\n```\n\n### One-liner verify (stdin + -v) - Insecure / Password is visible\n```text\necho 'My S3cr3t!' | cisco-hashgen -v '$8$HxHoQOhOgadA7E==$HjROgK8oWfeM45/EHbOwxCC328xBBYz2IF2BevFOSok=' \n[Verifying IOS/IOS-XE Type 8 PBKDF2-SHA256 hash]\n[+] Password matches.\n```\n> \ud83d\udca1 This above example illustrates the tool's flexibility for stdin/stdout. When executed this way, the password is displayed on screen and likely saved in the terminal history or process list. See more secure methods below.\n\n## Supplying passwords securely\n\n### A) Interactive (masked, safest)\n```text\ncisco-hashgen -asa\n```\n\n### B) Shell read (no secret in history)\n```text\nread -rs PW && printf '%s' \"$PW\" | cisco-hashgen -asa -quiet && unset PW\n# or use env var:\nread -rs PW && CISCO_HASHGEN_PWD=\"$PW\" cisco-hashgen -ios8 -env CISCO_HASHGEN_PWD -quiet && unset PW\n```\n\n### C) macOS Keychain (GUI \u2192 CLI)\n1. Open **Keychain Access** \u2192 add a new password item (e.g., Service: `HASHGEN_PW`).\n2. Use it without revealing plaintext:\n```text\nsecurity find-generic-password -w -s HASHGEN_PW | cisco-hashgen -asa -quiet\n```\n3. Remove later with: `security delete-generic-password -s HASHGEN_PW`\n\n### D) pass (Password Store)\n```text\nbrew install pass gnupg\ngpg --quick-generate-key \"Your Name <you@example.com>\" default default never\ngpg --list-secret-keys --keyid-format LONG\npass init <YOUR_LONG_KEY_ID>\n\npass insert -m network/asa/admin <<'EOF'\nStr0ngP@ss!\nEOF\n\npass show network/asa/admin | head -n1 | cisco-hashgen -ios8 -v\n```\n\n### E) CI secret environment variable (GitHub Actions)\n```yaml\n- name: Generate ASA hash\n  env:\n    CISCO_HASHGEN_PWD: ${{ secrets.CISCO_HASHGEN_PWD }}\n  run: |\n    cisco-hashgen -asa -env CISCO_HASHGEN_PWD -quiet > hash.txt\n```\n\n## Quoting cheatsheet (very important)\n\n- Always **single-quote** `$sha512...` / `$8$...` hashes to avoid `$` expansion:\n  ```text\n  cisco-hashgen -v '$sha512$5000$...$...'\n  ```\n- For passwords with spaces or shell characters, prefer interactive input, `read -rs`, Keychain, or `pass`.\n- If you must put a password on the command line (not recommended), single-quote it; if it contains a single quote, use:\n  ```text\n  'pa'\"'\"'ss'\n  ```\n\n## CLI\n\n```text\ncisco-hashgen -h\nusage: cisco-hashgen [-h] [-asa | -ios5 | -ios8 | -ios9] [-verify HASH] [-iter ITER] [-salt-bytes SALT_BYTES]\n                     [--ios9-salt-mode {cisco64,ascii,stdb64}] [-minlen MINLEN] [-maxlen MAXLEN] [-pwd STRING]\n                     [-env VAR] [-quiet] [-no-color] [-no-prompt] [-V] [-ios9-debug]\n```\n\n### options\n- `-h, --help` \u2014 show this help message and exit\n- `-asa` \u2014 Generate ASA PBKDF2 (SHA-512) hash (default).\n- `-ios5` \u2014 Generate IOS/IOS-XE Type 5 (MD5-crypt) hash.\n- `-ios8` \u2014 Generate IOS/IOS-XE Type 8 (PBKDF2-SHA256) hash.\n- `-ios9` \u2014 Generate IOS/IOS-XE Type 9 (scrypt) hash.\n- `-verify, -v HASH` \u2014 Verify a password against an existing hash.\n- `-iter ITER` \u2014 Override iterations (default: ASA=5000, IOS8=20000).\n- `-salt-bytes SALT_BYTES` \u2014 Override salt length in bytes (default: ASA=16, IOS8=10, IOS9=10).\n- `-ios9-debug` \u2014 Enable maximum IOS9 verify diagnostics\n- `-ios9-salt-mode` `{cisco64, ascii, stdb64}` \u2014 IOS9 salt field mode.  \n  - **cisco64** (default) stores Cisco64 text and uses decoded bytes for KDF.\n  - **ascii** stores Cisco64 text but uses the literal ASCII text for KDF;\n  - **stdb64** stores StdBase64 text and uses that literal ASCII for KDF.\n- `-minlen MINLEN` \u2014 Minimum password length (default: 8).\n- `-maxlen MAXLEN` \u2014 Maximum password length (default: 1024).\n- `-pwd STRING` \u2014 Password provided directly (quote if it contains spaces/shell chars).\n- `-env VAR` \u2014 Read password from environment variable VAR.\n- `-quiet` \u2014 Suppress banners and extra output (script-friendly).\n- `-no-color` \u2014 Disable ANSI colors in help/banners.\n- `-no-prompt` \u2014 Fail if no password is provided via stdin/-pwd/-env (no interactive prompt).\n- `-V, --version` \u2014 show program's version number and exit\n\n## Exit codes\n- `0` \u2014 Success / verified match  \n- `1` \u2014 Verify mismatch  \n- `2` \u2014 Unsupported/invalid hash format  \n- `3` \u2014 Password validation error  \n- `4` \u2014 No password provided and `-no-prompt` set  \n- `130` \u2014 User interrupted (Ctrl-C)\n\n## Technical notes\n\n- **ASA**: PBKDF2-HMAC-SHA512; iterations stored; salt Base64; **first 16 bytes** of DK stored.  \n  _Why it matters_: Only a portion of the derived key is stored, so reproducing the hash requires exact PBKDF2 parameters and truncation behavior.\n\n- **IOS/IOS-XE Type 5**: MD5-based crypt (`md5crypt`); 1000 iterations (fixed); salt up to 8 chars; Cisco Base64 alphabet (`./0..9A..Za..z`).  \n  _Why it matters_: Legacy format, still seen on older systems; uses a fixed iteration count and short salts, making it less secure but widely compatible.\n\n- **IOS/IOS-XE Type 8**: PBKDF2-HMAC-SHA256; **20000** iterations (fixed); salt 10 bytes; Cisco Base64 alphabet (`./0..9A..Za..z`).  \n  _Why it matters_: Modern, strong PBKDF2 with fixed parameters; hash reproduction must match iteration count exactly.\n\n- **IOS/IOS-XE Type 9 \u2013 Canonical**: scrypt (N=16384, r=1, p=1); salt 14 bytes; Cisco Base64 alphabet (`./0..9A..Za..z`).  \n  _Why it matters_: Strongest Cisco hash; requires exact scrypt parameters and binary salt encoding for compatibility.\n\n- **IOS/IOS-XE Type 9 \u2013 ASCII Salt**: scrypt (N=16384, r=1, p=1); salt literal ASCII (non-canonical but accepted by some platforms); salt length 14 chars; Cisco Base64 alphabet for hash output only.  \n  _Why it matters_: Some devices expect ASCII salt rather than binary; essential for login compatibility on these picky systems.\n\n- **IOS/IOS-XE Type 9 \u2013 Mixed Salt**: scrypt (N=16384, r=1, p=1); salt may contain printable ASCII + Cisco64 characters (non-canonical); length still 14; Cisco Base64 alphabet for hash output.  \n  _Why it matters_: Rare variant; sometimes seen when salts are generated inconsistently; necessary to replicate for exact hash matching.\n\n## Supported Platforms\n- Python 3.8+ (tested on 3.8\u20133.13)  \n- macOS / Linux / Windows\n\n## License\nCisco-Hashgen is available under the MIT license. See the LICENSE file for details.\nAuthor: Gilbert Mendoza\n\n## Changelog\nSee the [docs/releases](docs/releases/) folder for complete version history, or visit the [GitHub Releases](https://github.com/Krontab/cisco-hashgen/releases) page.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Generate and verify Cisco-compatible password hashes for Cisco ASA & IOS/IOS-XE.",
    "version": "2.0.1",
    "project_urls": {
        "Homepage": "https://github.com/Krontab/cisco-hashgen",
        "Issues": "https://github.com/Krontab/cisco-hashgen/issues"
    },
    "split_keywords": [
        "cisco",
        " asa",
        " ios",
        " pbkdf2",
        " password",
        " security",
        " networking",
        " router",
        " switch",
        " firewall"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f9b93203446d3a4a3aec72869993e24f2c01e8381af581a9204ada301c457900",
                "md5": "b5d0058af3e5652e21c8b3b71776d843",
                "sha256": "aa899e1be686fa1103e2787f2af94fddf8fb9b1e72acaaaedd81617a85d428ad"
            },
            "downloads": -1,
            "filename": "cisco_hashgen-2.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b5d0058af3e5652e21c8b3b71776d843",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 15218,
            "upload_time": "2025-08-14T05:24:48",
            "upload_time_iso_8601": "2025-08-14T05:24:48.558477Z",
            "url": "https://files.pythonhosted.org/packages/f9/b9/3203446d3a4a3aec72869993e24f2c01e8381af581a9204ada301c457900/cisco_hashgen-2.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "03aa0a27f877505740c79e1c628c841f20fc1779ab6e5a4d84f88071278a92b8",
                "md5": "723651fb2e857b1218af502ee3a074ea",
                "sha256": "43fd447da09d370fb0a2170a3cb77b6434ce18882bfe4fae9f9d4266dbba1362"
            },
            "downloads": -1,
            "filename": "cisco_hashgen-2.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "723651fb2e857b1218af502ee3a074ea",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 18841,
            "upload_time": "2025-08-14T05:24:50",
            "upload_time_iso_8601": "2025-08-14T05:24:50.867620Z",
            "url": "https://files.pythonhosted.org/packages/03/aa/0a27f877505740c79e1c628c841f20fc1779ab6e5a4d84f88071278a92b8/cisco_hashgen-2.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-14 05:24:50",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Krontab",
    "github_project": "cisco-hashgen",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "cisco-hashgen"
}
        
Elapsed time: 0.90297s