# Google2FA ## Google Two-Factor Authentication for PHP Google2FA is a PHP implementation of the Google Two-Factor Authentication Module, supporting the HMAC-Based One-time Password (HOTP) algorithm specified in [RFC 4226](https://tools.ietf.org/html/rfc4226) and the Time-based One-time Password (TOTP) algorithm specified in [RFC 6238](https://tools.ietf.org/html/rfc6238). ---
--- ## Menu - [Version Compatibility](#version-compatibility) - [Google Two-Factor Authentication for PHP](#google-two-factor-authentication-for-php) - [Laravel bridge](#laravel-bridge) - [Demos, Example & Playground](#demos-example--playground) - [Requirements](#requirements) - [Installing](#installing) - [Usage](#usage) - [How To Generate And Use Two Factor Authentication](#how-to-generate-and-use-two-factor-authentication) - [Generating QRCodes](#generating-qrcodes) - [QR Code Packages](#qr-code-packages) - [Examples of Usage](#examples-of-usage) - [HMAC Algorithms](#hmac-algorithms) - [Server Time](#server-time) - [Validation Window](#validation-window) - [Using a Bigger and Prefixing the Secret Key](#using-a-bigger-and-prefixing-the-secret-key) - [Google Authenticator secret key compatibility](#google-authenticator-secret-key-compatibility) - [Google Authenticator Apps](#google-authenticator-apps) - [Deprecation Warning](#deprecation-warning) - [Testing](#testing) - [Authors](#authors) - [License](#license) - [Contributing](#contributing) ## Version Compatibility PHP | Google2FA :--------|:---------- 7.4 | 8.x & 9.x 8.0 | 8.x & 9.x 8.1 | 8.x & 9.x 8.2 | 8.x & 9.x 8.3 | 8.x & 9.x 8.4 | 8.x & 9.x 8.5 (beta) | 8.x & 9.x ## ⚠️ Version 9.0.0 Breaking Change ### Default Secret Key Length Increased **Version 9.0.0** introduces a **breaking change**: The default secret key length has been increased from **16 to 32 characters** for enhanced security. #### What Changed? - `generateSecretKey()` now generates 32-character secrets by default (previously 16) - This increases cryptographic entropy from 80 bits to 160 bits - Maintains full compatibility with Google Authenticator and other TOTP apps #### Migration Guide **If you want to keep the previous behavior (16-character secrets):** ```php // Old default behavior (v8.x and below) $secret = $google2fa->generateSecretKey(); // New way to get 16-character secrets (v9.0+) $secret = $google2fa->generateSecretKey(16); ``` **If you want to use the new default (32-character secrets):** ```php // This now generates 32-character secrets by default $secret = $google2fa->generateSecretKey(); ``` #### Potential Impact Areas - **Database schemas**: Check if your `google2fa_secret` columns can handle 32 characters - **Validation rules**: Update any length validations that expect exactly 16 characters - **Tests**: Update test assertions expecting 16-character secrets - **UI components**: Ensure QR code displays and secret key fields accommodate longer secrets **Important**: Existing 16-character secrets remain fully functional. Database updates are only needed if you want to use the new 32-character default behavior. #### Why This Change? While 16-character secrets meet RFC 6238 minimum requirements, 32-character secrets provide significantly better security: - **16 chars**: 80 bits of entropy (adequate but minimal) - **32 chars**: 160 bits of entropy (much stronger against brute force) This change aligns with modern security best practices for cryptographic applications. ## Laravel bridge This package is agnostic, but there's a [Laravel bridge](https://github.com/antonioribeiro/google2fa-laravel). ## About QRCode generation This package does not generate QRCodes for 2FA. If you are looking for Google Two-Factor Authentication, but also need to generate QRCode for it, you can use the [Google2FA QRCode package](https://github.com/antonioribeiro/google2fa-qrcode), which integrates this package and also generates QRCodes using the BaconQRCode library, or check options on how to do it yourself [here in the docs](#qr-code-packages). ## Demos, Example & Playground Please check the [Google2FA Package Playground](http://pragmarx.com/playground/google2fa).  Here's a demo app showing how to use Google2FA: [google2fa-example](https://github.com/antonioribeiro/google2fa-example). You can scan the QR code on [this (old) demo page](https://antoniocarlosribeiro.com/technology/google2fa) with a Google Authenticator app and view the code changing (almost) in real time. ## Requirements - PHP 7.1 or greater ## Installing Use Composer to install it: composer require pragmarx/google2fa To generate inline QRCodes, you'll need to install a QR code generator, e.g. [BaconQrCode](https://github.com/Bacon/BaconQrCode): composer require bacon/bacon-qr-code ## Usage ### Instantiate it directly ```php use PragmaRX\Google2FA\Google2FA; $google2fa = new Google2FA(); return $google2fa->generateSecretKey(); ``` ## How To Generate And Use Two Factor Authentication Generate a secret key for your user and save it: ```php // Generates a 32-character secret key (v9.0.0+ default) $user->google2fa_secret = $google2fa->generateSecretKey(); // Or explicitly specify 16 characters for compatibility $user->google2fa_secret = $google2fa->generateSecretKey(16); ``` ## Generating QRCodes The more secure way of creating QRCode is to do it yourself or using a library. First you have to install a QR code generator e.g. BaconQrCode, as stated above, then you just have to generate the QR code url using: ```php $qrCodeUrl = $google2fa->getQRCodeUrl( $companyName, $companyEmail, $secretKey ); ``` Once you have the QR code url, you can feed it to your preferred QR code generator. ```php // Use your own QR Code generator to generate a data URL: $google2fa_url = custom_generate_qrcode_url($qrCodeUrl); /// and in your view:Scan me to return to the original page.
Scan me to return to the original page.