Skip to content

Security: futhr/exk_passwd

Security

docs/SECURITY.md

Security

Overview

ExkPasswd is designed with security as the highest priority. This document outlines the security measures, testing methodology, and known considerations.

Cryptographic Guarantees

Random Number Generation

All randomness uses :crypto.strong_rand_bytes/1 with rejection sampling to eliminate modulo bias:

# Unbiased random integer generation
def integer(max) do
  range_size = 0x1_0000_0000  # 2^32
  threshold = range_size - rem(range_size, max)
  integer_unbiased(max, threshold)
end

defp integer_unbiased(max, threshold) do
  value = :crypto.strong_rand_bytes(4) |> :binary.decode_unsigned()
  if value < threshold, do: rem(value, max), else: integer_unbiased(max, threshold)
end

Benefits:

  • Perfectly uniform distribution (no modulo bias)
  • Cryptographically secure randomness
  • Verified via chi-square statistical tests
  • Zero performance impact (rejection rate < 0.001%)

Dictionary

  • Uses EFF Large Wordlist (7,826 words)
  • Pre-computed at compile time for O(1) access
  • All words verified reachable through statistical testing
  • No filtering bias detected

Security Testing

Test Suite

Run comprehensive security tests:

# All security tests
mix test test/exk_passwd/security_test.exs

# Adversarial attack simulations
mix test test/exk_passwd/adversarial_test.exs

Adversarial Testing

The test suite simulates real attack scenarios:

  1. Statistical bias detection - Chi-square tests for uniformity
  2. Collision resistance - Birthday attack validation
  3. State correlation - Batch generation independence
  4. Dictionary coverage - Complete word space accessibility
  5. Entropy validation - Collision rate analysis
  6. Pattern detection - ML-resistant password structure
  7. Distribution analysis - Word length, digits, case transforms
  8. Parallel safety - Process independence verification

Test Coverage: 97.1% with 473 tests (60 doctests + 413 unit tests), all passing.

Security Considerations

Entropy Calculations

Theoretical entropy is calculated assuming:

  • Perfect uniform random selection
  • Known configuration parameters
  • EFF Large Wordlist (7,826 words)

For 4-word password: ~52 bits of entropy (2^52 ≈ 4.5 quadrillion combinations)

Preset Configurations

Public presets (:default, :xkcd, :wifi, etc.) have predictable structure.

Recommendation: Use custom Config for high-security applications:

config = Config.new!(
  num_words: 5,
  separator: "+",
  word_length: 6..9,
  case_transform: :random,
  digits: {3, 3}
)

password = ExkPasswd.generate(config)

Known Limitations

  1. Preset fingerprinting - Passwords generated with public presets can be identified by structure
  2. Dictionary knowledge - Attackers knowing the EFF wordlist reduces search space
  3. Configuration leakage - Password structure reveals some configuration parameters

These are inherent to structured passphrases, not implementation bugs.

Mitigation: Users should use custom configurations for sensitive applications.

Vulnerability Disclosure

If you discover a security vulnerability:

  1. DO NOT open a public GitHub issue
  2. Email security concerns to the maintainers
  3. Include clear reproduction steps
  4. Allow reasonable time for a fix before disclosure

Testing Methodology

Chi-Square Test

Validates uniform distribution of random values:

chi_square = Enum.reduce(frequencies, 0, fn {_, observed}, acc ->
  acc + :math.pow(observed - expected, 2) / expected
end)

# For df degrees of freedom at 99.9% confidence:
critical_value = df + :math.sqrt(2 * df) * 3.29
assert chi_square < critical_value

Collision Rate Analysis

Validates entropy claims via birthday paradox:

# Generate samples, check collision rate
unique = Enum.uniq(passwords) |> length()
collision_rate = (total - unique) / total

# Should be near 0 for high-entropy passwords
assert collision_rate < 0.001

Best Practices

For Library Users

  1. Use custom configs for sensitive applications (avoid public presets)
  2. Increase word count for higher security (6+ words recommended)
  3. Add randomization to separators and padding when possible
  4. Monitor entropy using ExkPasswd.Entropy.calculate/2 or ExkPasswd.Strength.analyze/2

For Contributors

  1. Never use :rand module - always use ExkPasswd.Random
  2. Avoid Enum.random/1 - not cryptographically secure
  3. Run security tests before committing: mix test test/exk_passwd/security_test.exs
  4. Maintain test coverage >90% overall, 100% for crypto code

Compliance

NIST Guidelines

ExkPasswd follows NIST SP 800-63B recommendations:

  • ✅ Minimum 64 bits entropy for high-value passwords (achieved with 5+ words)
  • ✅ Cryptographically secure random number generation
  • ✅ No weak patterns or predictable structures
  • ✅ Resistance to dictionary attacks (large word space)

OWASP Recommendations

  • ✅ Use of secure random number generator
  • ✅ Sufficient entropy for password generation
  • ✅ No hardcoded secrets or predictable patterns
  • ✅ Regular security testing and validation

References

Contact

For security-related questions or concerns, please contact the maintainers through the project's GitHub repository.


Last Updated: 2025-10-29

There aren’t any published security advisories