diff --git a/composer.json b/composer.json
index 3332066..4eafa37 100644
--- a/composer.json
+++ b/composer.json
@@ -10,7 +10,6 @@
],
"require": {
"php": "^8.1",
- "ext-openssl": "*",
"symfony/framework-bundle": "^6.4|^7.4|^8.0",
"doctrine/common": "^3.0",
"doctrine/orm": "^3.0",
diff --git a/config/services.xml b/config/services.xml
index 5fde9fb..447147a 100644
--- a/config/services.xml
+++ b/config/services.xml
@@ -26,8 +26,8 @@
-
prototype('array')
->children()
->scalarNode('generator')
- ->defaultValue('yokai_security_token.open_ssl_token_generator')
+ ->defaultValue('yokai_security_token.bin2hex_token_generator')
->end()
->scalarNode('duration')
->defaultValue('+2 days')
diff --git a/src/Generator/Bin2HexTokenGenerator.php b/src/Generator/Bin2HexTokenGenerator.php
new file mode 100644
index 0000000..35b1011
--- /dev/null
+++ b/src/Generator/Bin2HexTokenGenerator.php
@@ -0,0 +1,30 @@
+
+ */
+final class Bin2HexTokenGenerator implements TokenGeneratorInterface
+{
+ public function __construct(
+ /**
+ * @var int<1, max> The token length
+ */
+ private readonly int $length = 64,
+ ) {
+ }
+
+ public function generate(): string
+ {
+ $byteLength = (int)\ceil($this->length / 2);
+ \assert($byteLength >= 1);
+ $hex = \bin2hex(\random_bytes($byteLength));
+
+ return \substr($hex, 0, $this->length);
+ }
+}
diff --git a/src/Generator/OpenSslTokenGenerator.php b/src/Generator/OpenSslTokenGenerator.php
deleted file mode 100644
index 05d5cdc..0000000
--- a/src/Generator/OpenSslTokenGenerator.php
+++ /dev/null
@@ -1,28 +0,0 @@
-
- */
-final class OpenSslTokenGenerator implements TokenGeneratorInterface
-{
- public function __construct(
- private readonly int $length = 32,
- ) {
- if (!\function_exists('openssl_random_pseudo_bytes')) {
- throw new LogicException('The extension "openssl" is required to use "open ssl" token generator.');
- }
- }
-
- public function generate(): string
- {
- return \rtrim(\strtr(\base64_encode(\openssl_random_pseudo_bytes($this->length)), '+/', '-_'), '=');
- }
-}
diff --git a/tests/Generator/Bin2HexTokenGeneratorTest.php b/tests/Generator/Bin2HexTokenGeneratorTest.php
new file mode 100644
index 0000000..98aebff
--- /dev/null
+++ b/tests/Generator/Bin2HexTokenGeneratorTest.php
@@ -0,0 +1,33 @@
+generate();
+ self::assertSame($length, \mb_strlen($value));
+ }
+
+ self::assertSame(\array_unique($tokens), $tokens);
+ }
+
+ public static function length(): \Generator
+ {
+ yield [64];
+ yield [10];
+ yield [11];
+ }
+}
diff --git a/tests/Generator/OpenSslTokenGeneratorTest.php b/tests/Generator/OpenSslTokenGeneratorTest.php
deleted file mode 100644
index a82e967..0000000
--- a/tests/Generator/OpenSslTokenGeneratorTest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-
- *
- * phpcs:ignoreFile PSR1.Methods.CamelCapsMethodName.NotCamelCaps
- */
-final class OpenSslTokenGeneratorTest extends TestCase
-{
- public function test_it_generate_unique_token(): void
- {
- $generator = new OpenSslTokenGenerator();
-
- $tokens = [];
-
- for ($i = 1; $i <= 1000; $i++) {
- $tokens[] = $generator->generate();
- }
-
- self::assertSame(\array_unique($tokens), $tokens);
- }
-}