Salt Generator
Generate cryptographic salts for password hashing and encryption.
Recommended Salt Lengths
What Is a Cryptographic Salt?
A cryptographic salt is a random sequence of bytes added to a password (or other data) before it is passed through a hashing function. The salt is stored alongside the resulting hash so it can be re-applied during authentication. Because every user gets a unique salt, two users with the same password will have completely different stored hashes, making mass-cracking attacks impractical.
Salts were introduced specifically to defeat precomputed attacks such as rainbow tables — giant lookup tables that map common passwords to their hashes. When a salt is mixed in, an attacker would need a separate rainbow table for every possible salt value, an astronomically large task. A 16-byte random salt creates 2128 possible variations, rendering precomputed lookups useless.
It is important to distinguish a salt from a pepper (a secret key added server-side) and from a nonce (a value used only once for encryption). A salt is stored in plain text next to the hash; its job is uniqueness, not secrecy. Security comes from the one-way nature of the hash function combined with the salt's randomness.
Modern password-hashing algorithms such as bcrypt, scrypt, Argon2, and PBKDF2 all incorporate salt internally or accept it as a parameter. This salt generator lets you produce secure salts in multiple output formats so you can use them with whichever algorithm or library your project requires.
How This Salt Generator Works
This tool uses the browser's built-in Web Cryptography API (crypto.getRandomValues()) to fill a Uint8Array with the requested number of cryptographically secure random bytes. This is the same entropy source used by modern operating systems and is suitable for security-critical applications.
Once the raw bytes are generated, they are encoded into your chosen output format. The generator reports the salt's size in both bytes and bits so you can immediately verify it meets the entropy requirements of your chosen algorithm. Generating multiple salts at once (up to 20) is useful for batch provisioning of test accounts or seeding a database migration.
Entropy and Output-Length Formulas
Where:
- bytes= Salt length selected in the generator (8, 16, 32, or 64)
- bits= Total entropy in bits — each byte contributes exactly 8 bits of randomness
- hexChars= Number of characters in the hexadecimal output string (2 hex digits per byte)
- base64Chars= Number of characters in the standard Base64 output string (every 3 bytes → 4 chars, padded to a multiple of 4)
Choosing the Right Salt Length
Salt length is measured in bytes, and each byte contributes 8 bits of entropy. Longer salts are harder for attackers to brute-force but cost a few extra bytes of storage — a negligible price given the security gain. The table below summarises common recommendations:
| Algorithm | Recommended Salt | Entropy |
|---|---|---|
| bcrypt | 16 bytes (built-in) | 128 bits |
| PBKDF2 | 16+ bytes (NIST SP 800-132) | 128+ bits |
| scrypt | 16–32 bytes | 128–256 bits |
| Argon2 | 16–32 bytes | 128–256 bits |
| General / custom | ≥ 16 bytes | ≥ 128 bits |
For most web applications a 16-byte (128-bit) salt is the practical minimum. Security-conscious systems and those handling sensitive data (healthcare, finance) should prefer 32 bytes (256 bits). The 8-byte option exists for legacy compatibility only and should be avoided in new projects.
Output Formats Explained
This salt generator supports five output encoding formats. The underlying random bytes are identical regardless of format; only the representation changes. Choose the format that your library, database column, or configuration file expects.
- Hexadecimal — Each byte becomes two lowercase hex characters (0–9, a–f). A 16-byte salt produces a 32-character string. Hex is the most universally supported format and is the default in many hashing libraries.
- Base64 — Groups three bytes into four ASCII characters using the standard alphabet (A–Z, a–z, 0–9, +, /). Output is padded with
=to a multiple of four characters. A 16-byte salt encodes to 24 characters. Use this where compact text is important. - Base64 URL — Identical to Base64 but replaces
+with-,/with_, and omits padding. This is safe to embed directly in URLs and JSON Web Tokens (JWTs) without percent-encoding. - Byte Array — Outputs the decimal value of each byte (0–255) separated by commas, e.g.,
42, 197, 8, …. Handy for populating byte-array literals in Java, Go, or C# source code. - Binary — Each byte is printed as an 8-digit binary string (e.g.,
00101010), separated by spaces. Useful for educational demonstrations or low-level debugging.
When storing salts in a SQL database, hexadecimal in a VARCHAR(64) or CHAR(64) column is the most portable choice. For NoSQL stores or REST APIs, Base64 URL fits naturally inside JSON fields and Authorization headers without escaping.
Security Best Practices for Cryptographic Salts
Generating a salt correctly is only the first step. How you store, transmit, and use the salt determines the overall security of your password storage system. Follow these principles to avoid common pitfalls.
Always use a CSPRNG. This generator uses crypto.getRandomValues(), a cryptographically secure pseudo-random number generator (CSPRNG). Never use Math.random() or language-level rand() functions for security purposes — they are not designed to resist prediction.
Never reuse salts. Each password, each account, and each hashing event must receive a freshly generated, independent salt. Reusing salts across users partially defeats the purpose, because two users with the same password would again share the same hash.
Store the salt alongside the hash. The salt is not secret; it must be retrievable during login to re-derive the hash for comparison. Most libraries (e.g., bcrypt in Node.js) automatically embed the salt in the hash output string, so you store a single field. If you manage salts manually, keep a dedicated salt column in your users table.
Do not confuse salt with secret key material. If you need server-side secrecy, add a pepper — a secret value stored in an environment variable or secrets manager, not in the database. The salt handles uniqueness; the pepper adds confidentiality at the application layer.
Use a memory-hard hashing algorithm. Salts are most effective when paired with bcrypt (cost ≥ 12), scrypt, or Argon2id. Fast hash functions like MD5 or SHA-1 are unsuitable for passwords even with a salt, because GPUs can trial billions of guesses per second.
Integrating Salts in Your Application Code
Most modern hashing libraries handle salt generation internally, but understanding the underlying process helps you audit and configure them correctly. Below are common integration patterns.
In Node.js with bcrypt, the library generates a 16-byte salt automatically when you call bcrypt.hash(password, saltRounds). If you need an explicit salt for custom workflows, you can call bcrypt.genSalt(rounds) which returns a salt string you can inspect or store separately.
In Python with passlib, algorithms like argon2 and bcrypt auto-generate salts; you rarely handle them manually. For lower-level use with hashlib.scrypt() or hashlib.pbkdf2_hmac(), pass os.urandom(16) or os.urandom(32) as the salt parameter.
In Java, SecureRandom.nextBytes(byte[] salt) fills a byte array suitable for passing to javax.crypto.spec.PBEKeySpec or Spring Security's BCryptPasswordEncoder.
When working with JWT or API tokens, generate a Base64 URL salt to use as the random component of a token ID. This ensures tokens are unique across re-issuances even if user state has not changed.
For database migrations, use the quantity slider to generate a batch of salts upfront, then assign one per row in your migration script. This avoids making repeated network or OS calls inside a transaction loop.
Worked Examples
16-Byte Hexadecimal Salt (128-bit)
Problem:
Generate a 16-byte salt in hexadecimal format for use with PBKDF2 or bcrypt, and determine its entropy and output length.
Solution Steps:
- 1Select salt length: 16 bytes
- 2Calculate entropy: 16 bytes × 8 bits/byte = 128 bits
- 3Calculate hex output length: 16 bytes × 2 hex chars/byte = 32 characters
- 4Example output (representative): a3f7c29e4b1d8056e7a9f3c2d10b4e87
- 5This 32-character string uniquely identifies the salt and is safe to store as CHAR(32) in a database
Result:
128 bits of entropy; 32-character hex string — meets NIST SP 800-132 minimum recommendation for PBKDF2
32-Byte Base64 Salt (256-bit)
Problem:
Generate a 32-byte salt in Base64 format for Argon2id and determine the output character length.
Solution Steps:
- 1Select salt length: 32 bytes
- 2Calculate entropy: 32 bytes × 8 bits/byte = 256 bits
- 3Base64 groups 3 bytes into 4 characters: ⌈32 / 3⌉ = ⌈10.67⌉ = 11 groups
- 4Output characters: 11 × 4 = 44 characters (including = padding)
- 5Example output (representative): 7hXqW2mN9kLpR4sT1vYz8cJfB6eDgAoI3nKuVw==
Result:
256 bits of entropy; 44-character Base64 string — exceeds recommended minimum for Argon2id
8-Byte Binary Salt (64-bit, Legacy)
Problem:
Examine an 8-byte salt in binary format to understand its structure, entropy, and the resulting string length.
Solution Steps:
- 1Select salt length: 8 bytes
- 2Calculate entropy: 8 bytes × 8 bits/byte = 64 bits
- 3Binary encoding: each byte → 8-digit binary string, separated by spaces
- 4Output length: 8 groups × 8 chars + 7 spaces = 71 characters
- 5Example output (representative): 10110011 01001101 11100010 00011001 10101010 01110001 00001110 11011001
- 6Note: 64-bit salts are considered insufficient for modern systems; use 128 bits minimum
Result:
64 bits of entropy; 71-character binary string — only for educational or legacy use cases
Batch of 5 Base64 URL Salts for API Token Seeding
Problem:
Generate 5 unique 16-byte Base64 URL salts to use as random token components for five newly created API keys.
Solution Steps:
- 1Select salt length: 16 bytes
- 2Select format: Base64 URL
- 3Set quantity slider to 5
- 4Click Generate Salts
- 5Calculate expected output: Base64 URL of 16 bytes = 22 characters (no padding in URL-safe variant)
- 6Each of the 5 outputs is independent, derived from crypto.getRandomValues(), ensuring no two tokens share a component
Result:
5 unique 22-character Base64 URL strings, each with 128 bits of entropy — ready to append to API key prefixes
Tips & Best Practices
- ✓Always use crypto.getRandomValues() or an OS-level CSPRNG — never Math.random() — for any security-sensitive random value.
- ✓Default to 16 bytes (128 bits) for production salts; upgrade to 32 bytes for applications handling financial or health data.
- ✓Store the salt alongside the hash in the same database row — it is not secret, and you need it to verify passwords later.
- ✓Use Base64 URL format when embedding a salt or random token component in a URL, JWT, or HTTP header to avoid special-character escaping.
- ✓Never share or log salts in combination with the corresponding hash — together they allow offline cracking attempts without database access.
- ✓Pair any salt with a memory-hard algorithm (bcrypt, Argon2id, scrypt) rather than fast hashes like SHA-256 to resist GPU-accelerated brute force.
- ✓Use the quantity slider to pre-generate batches of salts for database seeding, migration scripts, or test fixture setup.
- ✓If your framework's hashing library (bcrypt, passlib, Spring Security) manages salts automatically, let it — manual salt management introduces more opportunities for mistakes.
Frequently Asked Questions
Sources & References
Last updated: 2026-06-05
Help us improve!
How would you rate the Salt Generator?
Editorial Note
MyCalcBuddy Editorial Team
This page is maintained as an educational calculator reference.
Formula Source: Standard Mathematical References
by Various