Password Domain#
Namespace: Infocyph\\Epicrypt\\Password
Scope#
password generation and policy
password hashing and verification
password rehash lifecycle
master secret generation
wrapped secret protection
wrapped secret rotation and rewrap flows
secure secret serialization
Password Generator#
use Infocyph\Epicrypt\Password\Generator\PasswordGenerator;
$generator = new PasswordGenerator();
$password = $generator->generate(16, [
'min_length' => 12,
'require_upper' => true,
'require_lower' => true,
'require_digit' => true,
'require_symbol' => true,
'include_ambiguous' => false,
]);
Password Hasher#
use Infocyph\Epicrypt\Password\PasswordHasher;
use Infocyph\Epicrypt\Password\Enum\PasswordHashAlgorithm;
$hasher = new PasswordHasher();
$hash = $hasher->hashPassword('MyStrongPassword!2026');
$isValid = $hasher->verifyPassword('MyStrongPassword!2026', $hash);
You can tune hashing options:
$hash = $hasher->hashPassword('password', [
'algorithm' => PasswordHashAlgorithm::ARGON2ID,
'memory_cost' => 65536,
'time_cost' => 4,
'threads' => 2,
]);
Password Rehash Lifecycle#
use Infocyph\Epicrypt\Password\PasswordHasher;
use Infocyph\Epicrypt\Security\Policy\SecurityProfile;
$hasher = new PasswordHasher();
$result = $hasher->verifyAndRehash('password', $storedHash, [
'profile' => SecurityProfile::MODERN,
]);
if ($result->verified && $result->rehashedHash !== null) {
$storedHash = $result->rehashedHash;
}
Password Strength#
use Infocyph\Epicrypt\Password\PasswordStrength;
$score = (new PasswordStrength())->score('MyStrongPassword!2026');
// 0..100
Password Policy Validation#
use Infocyph\Epicrypt\Password\Generator\PasswordPolicy;
use Infocyph\Epicrypt\Password\PasswordPolicyValidator;
$policy = new PasswordPolicy(minLength: 12, requireUpper: true, requireLower: true, requireDigit: true, requireSymbol: true);
$result = (new PasswordPolicyValidator())->validate('MyPassword123!', $policy);
// $result->valid
// $result->score
// $result->violations
Compromised Password Checker Contract#
use Infocyph\Epicrypt\Password\Contract\CompromisedPasswordCheckerInterface;
use Infocyph\Epicrypt\Password\NullCompromisedPasswordChecker;
$checker = new NullCompromisedPasswordChecker();
$isCompromised = $checker->isCompromised('candidate-password');
Master Secret + Wrapped Secret#
use Infocyph\Epicrypt\Password\Secret\MasterSecretGenerator;
use Infocyph\Epicrypt\Password\Secret\WrappedSecretManager;
$masterSecret = (new MasterSecretGenerator())->generate();
$wrapped = (new WrappedSecretManager())->wrap('sensitive-secret', $masterSecret);
$plain = (new WrappedSecretManager())->unwrap($wrapped, $masterSecret);
Wrapped secret format is versioned (eps1.*) and fail-closed on invalid input.
Wrapped Secret Rotation#
use Infocyph\Epicrypt\Password\Secret\WrappedSecretManager;
use Infocyph\Epicrypt\Security\KeyRing;
$manager = new WrappedSecretManager();
$rotated = $manager->rewrap($wrapped, $oldMasterSecret, $newMasterSecret);
$ring = new KeyRing(['old' => $oldMasterSecret, 'new' => $newMasterSecret], 'new');
$result = $manager->unwrapWithAnyKeyResult($rotated, $ring);
$plain = $result->plaintext;
Secure Secret Serialization#
use Infocyph\Epicrypt\Password\Secret\SecureSecretSerializer;
$serializer = new SecureSecretSerializer();
$encoded = $serializer->serialize(['api_key' => 'value']);
$decoded = $serializer->unserialize($encoded);