32) { throw new \RuntimeException('Backup code can have maximum 32 digits!'); } if ($code_length < 6) { throw new \RuntimeException('Code must have at least 6 digits to ensure security!'); } $this->code_count = $code_count; $this->code_length = $code_length; } /** * Generates a single backup code. * It is a random hexadecimal value with the digit count configured in constructor * @return string The generated backup code (e.g. 1f3870be2) * @throws \Exception If no entropy source is available. */ public function generateSingleCode() : string { $bytes = random_bytes(32); return substr(md5($bytes), 0, $this->code_length); } /** * Returns a full backup code set. The code count can be configured in the constructor * @return string[] An array containing different backup codes. */ public function generateCodeSet() : array { $array = []; for($n=0; $n<$this->code_count; $n++) { $array[] = $this->generateSingleCode(); } return $array; } }