search
HomeBackend DevelopmentPHP TutorialSample code sharing for implementing OATH dynamic password algorithm in PHP

Sample code sharing of PHP implementing OATH dynamic password algorithm

<?PHP  
/** 
 * This program is free software: you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 * 
 * PHP Google two-factor authentication module. 
 * 
 * See http://www.idontplaydarts.com/2011/07/google-totp-two-factor-authentication-for-php/ 
 * for more details 
 * 
 * @author Phil 
 **/  
  
class Google2FA {  
  
    const keyRegeneration     = 30;    // Interval between key regeneration  
    const otpLength        = 6;    // Length of the Token generated  
  
    private static $lut = array(    // Lookup needed for Base32 encoding  
        "A" => 0,    "B" => 1,  
        "C" => 2,    "D" => 3,  
        "E" => 4,    "F" => 5,  
        "G" => 6,    "H" => 7,  
        "I" => 8,    "J" => 9,  
        "K" => 10,    "L" => 11,  
        "M" => 12,    "N" => 13,  
        "O" => 14,    "P" => 15,  
        "Q" => 16,    "R" => 17,  
        "S" => 18,    "T" => 19,  
        "U" => 20,    "V" => 21,  
        "W" => 22,    "X" => 23,  
        "Y" => 24,    "Z" => 25,  
        "2" => 26,    "3" => 27,  
        "4" => 28,    "5" => 29,  
        "6" => 30,    "7" => 31  
    );  
  
    /** 
     * Generates a 16 digit secret key in base32 format 
     * @return string 
     **/  
    public static function generate_secret_key($length = 16) {  
        $b32     = "234567QWERTYUIOPASDFGHJKLZXCVBNM";  
        $s     = "";  
  
        for ($i = 0; $i < $length; $i++)  
            $s .= $b32[rand(0,31)];  
  
        return $s;  
    }  
  
    /** 
     * Returns the current Unix Timestamp devided by the keyRegeneration 
     * period. 
     * @return integer 
     **/  
    public static function get_timestamp() {  
        return floor(microtime(true)/self::keyRegeneration);  
    }  
  
    /** 
     * Decodes a base32 string into a binary string. 
     **/  
    public static function base32_decode($b32) {  
  
        $b32     = strtoupper($b32);  
  
        if (!preg_match(&#39;/^[ABCDEFGHIJKLMNOPQRSTUVWXYZ234567]+$/&#39;, $b32, $match))  
            throw new Exception(&#39;Invalid characters in the base32 string.&#39;);  
  
        $l     = strlen($b32);  
        $n    = 0;  
        $j    = 0;  
        $binary = "";  
  
        for ($i = 0; $i < $l; $i++) {  
  
            $n = $n << 5;                 // Move buffer left by 5 to make room  
            $n = $n + self::$lut[$b32[$i]];     // Add value into buffer  
            $j = $j + 5;                // Keep track of number of bits in buffer  
  
            if ($j >= 8) {  
                $j = $j - 8;  
                $binary .= chr(($n & (0xFF << $j)) >> $j);  
            }  
        }  
  
        return $binary;  
    }  
  
    /** 
     * Takes the secret key and the timestamp and returns the one time 
     * password. 
     * 
     * @param binary $key - Secret key in binary form. 
     * @param integer $counter - Timestamp as returned by get_timestamp. 
     * @return string 
     **/  
    public static function oath_hotp($key, $counter)  
    {  
        if (strlen($key) < 8)  
        throw new Exception(&#39;Secret key is too short. Must be at least 16 base 32 characters&#39;);  
  
        $bin_counter = pack(&#39;N*&#39;, 0) . pack(&#39;N*&#39;, $counter);        // Counter must be 64-bit int  
        $hash      = hash_hmac (&#39;sha1&#39;, $bin_counter, $key, true);  
  
        return str_pad(self::oath_truncate($hash), self::otpLength, &#39;0&#39;, STR_PAD_LEFT);  
    }  
  
    /** 
     * Verifys a user inputted key against the current timestamp. Checks $window 
     * keys either side of the timestamp. 
     * 
     * @param string $b32seed 
     * @param string $key - User specified key 
     * @param integer $window 
     * @param boolean $useTimeStamp 
     * @return boolean 
     **/  
    public static function verify_key($b32seed, $key, $window = 4, $useTimeStamp = true) {  
  
        $timeStamp = self::get_timestamp();  
  
        if ($useTimeStamp !== true) $timeStamp = (int)$useTimeStamp;  
  
        $binarySeed = self::base32_decode($b32seed);  
  
        for ($ts = $timeStamp - $window; $ts <= $timeStamp + $window; $ts++)  
            if (self::oath_hotp($binarySeed, $ts) == $key)  
                return true;  
  
        return false;  
  
    }  
  
    /** 
     * Extracts the OTP from the SHA1 hash. 
     * @param binary $hash 
     * @return integer 
     **/  
    public static function oath_truncate($hash)  
    {  
        $offset = ord($hash[19]) & 0xf;  
  
        return (  
            ((ord($hash[$offset+0]) & 0x7f) << 24 ) |  
            ((ord($hash[$offset+1]) & 0xff) << 16 ) |  
            ((ord($hash[$offset+2]) & 0xff) << 8 ) |  
            (ord($hash[$offset+3]) & 0xff)  
        ) % pow(10, self::otpLength);  
    }  
  
  
  
}  
  
$InitalizationKey = "LFLFMU2SGVCUIUCZKBMEKRKLIQ";                    // Set the inital key  
  
$TimeStamp      = Google2FA::get_timestamp();  
$secretkey       = Google2FA::base32_decode($InitalizationKey);    // Decode it into binary  
$otp             = Google2FA::oath_hotp($secretkey, $TimeStamp);    // Get current token  
  
echo("Init key: $InitalizationKey\n");  
echo("Timestamp: $TimeStamp\n");  
echo("One time password: $otp\n");  
  
// Use this to verify a key as it allows for some time drift.  
  
$result = Google2FA::verify_key($InitalizationKey, "123456");  
  
var_dump($result);  
  
?>

The above content is saved as oath .php, there are two ways to test and run:

1. Run command line: php.exe oath.php

Everyone knows about the path problem

2. Deploy in the web directory and access through the web page

For example: http://localhost/oath.php

The above is the detailed content of Sample code sharing for implementing OATH dynamic password algorithm in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
What is the full form of PHP?What is the full form of PHP?Apr 28, 2025 pm 04:58 PM

The article discusses PHP, detailing its full form, main uses in web development, comparison with Python and Java, and its ease of learning for beginners.

Is PHP a case-sensitive language?Is PHP a case-sensitive language?Apr 28, 2025 pm 04:55 PM

PHP's case sensitivity varies: functions are insensitive, while variables and classes are sensitive. Best practices include consistent naming and using case-insensitive functions for comparisons.

How do you redirect a page in PHP?How do you redirect a page in PHP?Apr 28, 2025 pm 04:54 PM

The article discusses various methods for page redirection in PHP, focusing on the header() function and addressing common issues like "headers already sent" errors.

What is PDO in PHP?What is PDO in PHP?Apr 28, 2025 pm 04:51 PM

The article discusses PHP Data Objects (PDO), an extension for database access in PHP. It highlights PDO's role in enhancing security through prepared statements and its benefits over MySQLi, including database abstraction and better error handling.

What is Memcache and Memcached in PHP? Is it possible to share a single instance of a Memcache between several projects of PHP?What is Memcache and Memcached in PHP? Is it possible to share a single instance of a Memcache between several projects of PHP?Apr 28, 2025 pm 04:47 PM

Memcache and Memcached are PHP caching systems that speed up web apps by reducing database load. A single instance can be shared among projects with careful key management.

What are the steps to create a new database using MySQL and PHP?What are the steps to create a new database using MySQL and PHP?Apr 28, 2025 pm 04:44 PM

Article discusses steps to create and manage MySQL databases using PHP, focusing on connection, creation, common errors, and security measures.

Does JavaScript interact with PHP?Does JavaScript interact with PHP?Apr 28, 2025 pm 04:43 PM

The article discusses how JavaScript and PHP interact indirectly through HTTP requests due to their different environments. It covers methods for sending data from JavaScript to PHP and highlights security considerations like data validation and prot

How to execute a PHP script from the command line?How to execute a PHP script from the command line?Apr 28, 2025 pm 04:41 PM

The article discusses executing PHP scripts from the command line, including steps, common options, troubleshooting errors, and security considerations.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Atom editor mac version download

Atom editor mac version download

The most popular open source editor