13th
Ноя

Солим хэш

Автор: admin | Рубрика: Безопасность

salt-word-m

Солим Хэш

И так, для чего именно нужно “Солить хэш” это пусть каждый решает в меру своей собственной параноидальности.

Вот моя наработка в этой области, которую включил в будущую CMS:

Схема проста, берется 2 рандомные соли в диапазоне от 1 до 100 и посыпаются при варки Хэша. Получаеться, что система производит мини брут хэша равный 10 000 комбинаций при сверке хэша (можно задать и больше, но это будет влиять на производительность).

Использование:

<?
/*
 * include 'auth.class.php';
 * $PWD = new Password();
 * print $PWD->GenOrCheckHash('Yourpassword'); // Function returns HASH
 * print $PWD->GenOrCheckHash('Yourpassword','YourHASH'); // Function returns SALT values
 */
class Password {
 
 function GenOrCheckHash($pass,$hash = false){
 // PHP VERSION 4 OR 5 (3 doesnt support)
 $v = floatval(phpversion());
 
  if( $v >= 5  ){
   if($hash == false){
    return $this->GenHashPHP5($pass);
   } else {
    return $this->CheckPasswdPHP5($pass,$hash);
   }
  }
  elseif( $v >= 4 && $v < 5 ) {
   if($hash == false){
    return $this->GenHashPHP4($pass);
   } else {
    return $this->CheckPasswdPHP4($pass,$hash);
   }
  }
 }
 
 // Gen PHP4 Hash using MD5() and SHA1()
 function GenHashPHP4($pass){
  $salt1=rand(1,100);
  $salt2=rand(1,100);
   return md5(sha1(md5($pass).md5($salt1)).sha1($salt2));
 }
 
 // Gen PHP5 Hash using whirlpool AND sha512
 function GenHashPHP5($pass){
  $salt1=rand(1,100);
  $salt2=rand(1,100);
   return hash('whirlpool',hash('whirlpool',hash('whirlpool',$pass).hash('sha512',$salt1)).hash('sha512',$salt2));
 }
 
 // CheckPasswordPHP4 using double FOR salt
 function CheckPasswdPHP4($pass,$hash){
  for($i1=1;$i1<=100;$i1++){
   for($i2=1;$i2<=100;$i2++){
    $gen_hash=md5(sha1(md5($pass).md5($i1)).sha1($i2));
    if($gen_hash == $hash){
      return "Found with salt ".$i1." and ".$i2." <br>";
    }
   }
  }
 }
 
 // CheckPasswordPHP5 using double FOR salt
 function CheckPasswdPHP5($pass,$hash){
  for($i1=1;$i1<=100;$i1++){
   for($i2=1;$i2<=100;$i2++){
    $gen_hash=hash('whirlpool',hash('whirlpool',hash('whirlpool',$pass).hash('sha512',$i1)).hash('sha512',$i2));
    if($gen_hash == $hash){
      return "Found with salt ".$i1." and ".$i2." <br>";
    }
   }
  }
 }
}
 
?>

исходник