Skip to main content
When a user updates their password through a password input, FunnelFox sends hashed versions of that password in the profile.updated webhook payload.
Learn more in the webhook reference.

Hash formats

FunnelFox normalizes all passwords to UTF-8 NFC before hashing. Password hashes are provided in four formats:
  • argon2id — modern, secure algorithm (PHC format)
  • bcrypt — widely supported (standard bcrypt format)
  • pbkdf2_sha256 — PBKDF2-HMAC-SHA256 (PHC format)
  • scrypt — memory-hard algorithm (PHC format)
Each hash contains all the parameters needed for verification. Salts are included in the hash strings, so you don’t need to store them separately.

Argon2ID

PHC format: $argon2id$v=19$m=65536,t=3,p=4$<base64-salt>$<base64-hash> Parameters:
  • Memory: 65536 KiB (64 MB)
  • Time cost: 3 iterations
  • Parallelism: 4 threads
  • Hash length: 32 bytes
  • Salt length: 16 bytes

BCrypt

Standard format: $2a$12$<22-char-salt><31-char-hash> Parameters:
  • Cost factor: 12
  • Salt length: 16 bytes (encoded as 22 base64 characters)

PBKDF2-SHA256

PHC format: $pbkdf2-sha256$i=210000$<base64-salt>$<base64-hash> Parameters:
  • Iterations: 210,000
  • Hash algorithm: SHA-256
  • Hash length: 32 bytes
  • Salt length: 16 bytes

Scrypt

PHC format: $scrypt$n=65536,r=8,p=1$<base64-salt>$<base64-hash> Parameters:
  • N (CPU/memory cost): 65536
  • r (block size): 8
  • p (parallelization): 1
  • Hash length: 32 bytes
  • Salt length: 16 bytes

Verification

To verify passwords in your system, compare the plaintext password against the hash received from the webhook.

Dependencies

Example

Always use constant-time comparison functions like hmac.compare_digest to compare hashes. This protects against timing attacks.

Troubleshooting

Some Base64 decoders require padding. If decoding fails, add == padding as shown in the example code above.