leonardosc

AutheMe.class.php

May 3rd, 2015
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.50 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4.  * Esta é uma classe para auxiliar na autenticação e registro de contas do authme em seu site.
  5.  * Autor: DevLeeo
  6.  * Skype: DevLeeo
  7.  * Data: 21/01/2015
  8.  */
  9. class AuthMe
  10. {
  11.  
  12.     /* TIPOS DE HASH DO AUTHME */
  13.     const MD5 = "md5";
  14.  
  15.     const SHA256 = "sha256";
  16.  
  17.     const SHA1 = "sha1";
  18.  
  19.     const WHIRLPOOL = "whirlpool";
  20.  
  21.     const MD5VB = "md5vb";
  22.  
  23.     const PLAINTEXT = "plaintext";
  24.  
  25.     /* CONEXÃO DO BANCO DE DADOS. */
  26.     private $conection;
  27.  
  28.     /* NOME DA TASBELA DO AUTHME */
  29.     private $authme_table;
  30.  
  31.     /* HASH USADA */
  32.     private $algorithm;
  33.  
  34.     /*
  35.      * ESTA É A METODO CONSTRUTOR DA CLASSE *
  36.      *
  37.      * PARAMETROS
  38.      * $db_host = Ip do seu banco de dados mysql;
  39.      * $db_user = Nome de usuario do seu banco de dados mysql.
  40.      * $db_pass = Senha do seu banco de dados mysql;
  41.      * $db_name = Nome do database do mysql;
  42.      * $authme_table = Nome da tabela do authme;
  43.      * $algo = Tipo de hash que seu authme está utilizando;
  44.      */
  45.     public function __construct($db_host, $db_user, $db_pass, $db_name, $authme_table, $algo)
  46.     {
  47.         $this->authme_table = $authme_table;
  48.         $this->algorithm = $algo;
  49.         @$this->conection = mysqli_connect($db_host, $db_user, $db_pass) or die(mysqli_connect_error());
  50.         @mysqli_select_db($this->conection, $db_name) or die(mysqli_error($this->conection));
  51.     }
  52.  
  53.     /* METODO DESTRUTOR, O CONTRARIO DO CONSTRUTOR '-' */
  54.     public function __destruct()
  55.     {
  56.         if (is_object($this->conection)) {
  57.             $this->conection->close();
  58.             unset($this->algorithm);
  59.             unset($this->authme_table);
  60.         }
  61.     }
  62.  
  63.     /*
  64.      * METODO USADO PARA AUTENTICAR UM USUARIO
  65.      *
  66.      * PARAMETROS
  67.      * $user = Nome de usuario.
  68.      * $pass = Senha do usuario.
  69.      *
  70.      */
  71.     public function authenticate($user, $pass)
  72.     {
  73.         $user = addslashes($user);
  74.         $query = mysqli_query($this->conection, "SELECT password FROM {$this->authme_table} WHERE username='{$user}'");
  75.        
  76.         if (mysqli_num_rows($query) == 1) {
  77.             $hash_pass = mysqli_fetch_array($query)[0];
  78.             return self::compare($pass, $hash_pass);
  79.         } else {
  80.             return false;
  81.         }
  82.     }
  83.  
  84.     /*
  85.      * METODO USADO PARA REGISTRAR UM USUARIO
  86.      *
  87.      * PARAMETROS
  88.      * $user = Nome de usuario.
  89.      * $pass = Senha do usuario.
  90.      * $ip = Ip do usuario.
  91.      */
  92.     public function register($user, $pass, $ip = "0.0.0.0")
  93.     {
  94.         $user = addslashes($user);
  95.         $pass = addslashes(self::AMHash($pass));
  96.        
  97.         if (self::isUsernameRegistered($user)) {
  98.             return false;
  99.         }
  100.        
  101.         return mysqli_query($this->conection, "INSERT INTO {$this->authme_table} (`username`, `password`, `ip`, `lastlogin`, `x`, `y`, `z`) VALUES ('{$user}','{$pass}','{$ip}','0','0','0','0')");
  102.     }
  103.  
  104.     /*
  105.      * METODO USADO PARA ALTERAR A SENHA DE UM USUARIO
  106.      *
  107.      * PARAMETROS
  108.      * $user = Nome de usuario.
  109.      * $newpass = Nova senha do usuario.
  110.      *
  111.      */
  112.     public function changePassword($username, $newpass)
  113.     {
  114.         if (! self::isUsernameRegistered($username)) {
  115.             return false;
  116.         }
  117.        
  118.         $username = addslashes($username);
  119.         $newpass = addslashes(self::AMHash($newpass));
  120.        
  121.         return mysqli_query($this->conection, "UPDATE {$this->authme_table} SET password='$newpass' WHERE username='$username'");
  122.     }
  123.  
  124.     /*
  125.      * METODO USADO PARA VERIFICAR SE UM DETERMINADO IP ESTA REGISTRADO.
  126.      *
  127.      * PARAMETROS
  128.      * $ip = Ip que deseja verificar.
  129.      */
  130.     public function isIpRegistered($ip)
  131.     {
  132.         $ip = addslashes($ip);
  133.         $query = mysqli_query($this->conection, "SELECT ip FROM {$this->authme_table} WHERE ip='{$ip}'");
  134.         return mysqli_num_rows($query) >= 1;
  135.     }
  136.  
  137.     /*
  138.      * METODO USADO PARA VERIFICAR SE UM DETERMINADO NOME DE USUARIO ESTA REGISTRADO.
  139.      *
  140.      * PARAMETROS
  141.      * $user = Nome de usuario que deseja verificar.
  142.      */
  143.     public function isUsernameRegistered($user)
  144.     {
  145.         $user = addslashes($user);
  146.         $query = mysqli_query($this->conection, "SELECT username FROM {$this->authme_table} WHERE username='{$user}'");
  147.         return mysqli_num_rows($query) >= 1;
  148.     }
  149.  
  150.     /* FUNCOES PRIVADAS, USO SOMENTE DA CLASSE. */
  151.     private function compare($pass, $hash_pass)
  152.     {
  153.         switch ($this->algorithm) {
  154.            
  155.             case "sha256":
  156.                 $shainfo = explode("$", $hash_pass);
  157.                 $pass = hash("sha256", $pass) . $shainfo[2];
  158.                 return strcasecmp($shainfo[3], hash('sha256', $pass)) == 0;
  159.            
  160.             case "sha1":
  161.                 return strcasecmp($hash_pass, hash('sha1', $pass)) == 0;
  162.            
  163.             case "md5":
  164.                 return strcasecmp($hash_pass, hash('md5', $pass)) == 0;
  165.            
  166.             case "whirlpool":
  167.                 return strcasecmp($hash_pass, hash('whirlpool', $pass)) == 0;
  168.            
  169.             case "md5vb":
  170.                 $shainfo = explode("$", $hash_pass);
  171.                 $pass = hash("md5", $pass) . $shainfo[2];
  172.                 return strcasecmp($shainfo[3], hash('md5', $pass)) == 0;
  173.            
  174.             case "plaintext":
  175.                 return $hash_pass == $pass;
  176.            
  177.             default:
  178.                 return false;
  179.         }
  180.     }
  181.  
  182.     private function AMHash($pass)
  183.     {
  184.         switch ($this->algorithm) {
  185.            
  186.             case "sha256":
  187.                 $salt = self::createSalt();
  188.                 return "\$SHA\$" . $salt . "\$" . hash("sha256", hash('sha256', $pass) . $salt);
  189.            
  190.             case "sha1":
  191.                 return hash("sha1", $pass);
  192.            
  193.             case "md5":
  194.                 return hash("sha1", $pass);
  195.            
  196.             case "whirlpool":
  197.                 return hash("sha1", $pass);
  198.            
  199.             case "md5vb":
  200.                 $salt = self::createSalt();
  201.                 return "\$MD5vb\$" . $salt . "\$" . hash("md5", hash('md5', $pass) . $salt);
  202.            
  203.             case "plaintext":
  204.                 return $pass;
  205.            
  206.             default:
  207.                 return false;
  208.         }
  209.     }
  210.  
  211.     private function createSalt()
  212.     {
  213.         $salt = "";
  214.         for ($i = 0; $i < 20; $i ++) {
  215.             $salt .= rand(0, 9);
  216.         }
  217.         return substr(hash("sha1", $salt), 0, 16);
  218.     }
  219. }
Advertisement
Add Comment
Please, Sign In to add comment