PDA

View Full Version : سوال: کد امنیتی طراحی من امن است؟؟؟



pirmard66
سه شنبه 01 اسفند 1391, 02:00 صبح
با سلام خدمت دوستان و اساتید عزیز...

یک کد برای امنیت ورودی پسورد نوشتم که میخواستم دوستان تست کنن و میزان امنیتش رو به من بگن!


<?php
$salt=md5(time());
$salta=substr($salt,0,16);
$saltb=substr($salt,16,16);
//end $salt
$pass="mehdi666";
$pass=md5(sha1($pass));
$pass=($salta.$pass.$saltb);
//end $pass
$salta=substr($pass,0,16);
$saltb=substr($pass,48,16);
$salt=$salta.$saltb;
//Return $salt
?>

راستی بخش time() رو از آقای شهرکی ایده گرفتم!!

فقط دوستان یه سوال؟!

اگه یه کاربر رمزش رو فراموش کنه چطوری میتونیم رمز جدید بهش بدیم؟
با توجه که رمز قدیم برگشت ناپذیر...
منتظرم:متفکر:

rezaonline.net
سه شنبه 01 اسفند 1391, 02:13 صبح
من یه کلاس هش پسورد نوشتم ببین به دردت میخوره .
مثالهای استفاده اش توی خطهای آخر هست .

<?php
class reHash
{
private $round = NULL ,
$salt = NULL ,
$error = array() ,
$configSet = false;

const defaultRound = 4000 ,
defaultSalt = 'aTyTIOPdf15AdswPOS8a9erpOaq8';


static private $ins = NULL ;


//return instance
static public function ins()
{
if(is_null(self::$ins))
self::$ins = new self ;
return self::$ins;
}

// set config only one time!
public function setConfig( array $con = array())
{
if($this->configSet)
{
$this->error[] = 'Config was setted !';
return false;
}
else
{
$this->configSet = true;
if(empty($con['round']))
$this->round = self::defaultRound;
else
$this->round = $con['round'];

if(empty($con['salt']))
$this->salt = self::defaultSalt;
else
$this->salt = $con['salt'];

return true;
}
}


// random character
static public function randomChar($max=8 , $salt='')
{
$max = (int) $max ;
$str = $salt . time() . mt_rand(1,80). $salt . $_SERVER['REMOTE_ADDR'] .microtime(true);
$random = md5($str);
for(;;)
{
$random .= md5($random);
if(strlen($random) >= $max)
break;
}
return substr($random , 1 , $max);
}


//random number
static public function randomNum($max = 8 , $salt='')
{
$max = (int) $max;
$num = preg_replace('@([^1-9])@','',self::randomChar($max*3,$salt));
for(;;)
{
$num .= preg_replace('@([^0-9])@','',md5($num)) ;
if(strlen($num) >= $max)
break;
}
return substr($num , 1 , $max);
}


//create hash
public function create($pass = '')
{
if( ! $this->configSet)
$this->error[] = 'Config not setted yet!';

if(empty($pass))
{
$this->error[] = 'Password can not be empty in `create` method!';
return false;
}

//create
$rand = self::randomNum(16,$this->salt);

$this->round += 5 ;
for($i=0 ; $i<=$this->round ; $i++)
$hash = hash('sha256', $this->salt.$rand.$pass, true);

return base64_encode($this->round .'*'.$rand.'*'.$hash);
}

//check
public function check($pass = '' , $hash='')
{
if( ! $this->configSet)
$this->error[] = 'Config not setted yet!';

if(empty($pass))
{
$this->error[] = 'Password can not be empty in `check` method!';
return false;
}

if(empty($hash))
{
$this->error[] = 'Hash can not be empty in `check` method!';
return false;
}

//check
$str = explode('*',base64_decode($hash));
$round = $str[0];
$rand = $str[1];
$_hash = $str[2];
for($i=0 ; $i<=$round ; $i++)
$hash = hash('sha256', $this->salt.$rand.$pass, true);
return $_hash === $hash;
}

//return error
public function getError()
{
return $this->error;
}
}


/// usage \\\

reHash::ins()->setConfig(array(
'salt'=>'a78958yTIOPdf15AswPOS8a9ddddddddderperfg' ,
'round'=>5000,
));

echo $h = reHash::ins()->create('reza');
echo '<pre><hr>';



echo '<br>';
$s = 'NTAwNSo2ODczNzUyNDI4NTcyNzEzKqMaqcABg+EiNXY792Y2H 6BmkcfVuVegkkMOY7c290hS';
echo reHash::ins()->check('reza',$s);

echo '<hr>';
print_r(reHash::ins()->getError());

pirmard66
سه شنبه 01 اسفند 1391, 02:19 صبح
ممنون دوست خوبم...

ولی جواب سوال هامو نگرفتم هنوز...

راستی من سعی میکنم خودم کد هامو بنویسم و از دوستان فقط راهنمایی بگیرم با تشکر!!!

shahriyar3
سه شنبه 01 اسفند 1391, 02:20 صبح
به نظر من اگر بخوای برای کل پسورد های وارد شده این عمل و انجام بدی خیلی جالب نیست!!
شاید فقط برای ادمین انجام بدی خوب باشه ولی اینکه مثلا برای تعداد زیادی کاربر موقع لاگین بخوای این کار و تکرار کنی به نظرم یه بار اضافه به سرور داری الکی وارد میکنی
وقتی crypte میکنی مثلا به md5 دیگه این بر گشت پذیر نیست مگر اینکه قبلا کشف شده باشه معادلش
بنا بر این اگر کسی به اطلاعات دیتابیس شما بصورت مستقیم دسترسی پیدا کنه هم اگر عبارت معادلش و نداشته باشه هیچ کاری نمیتونه بکنه
حالا اگر ادمین پسوردش و یک عبارت ساده انتخاب کرده بود مثل 123456 اگر از این روشی که خودت گفتی استفاده کنی پیدا کردنش با استفاده از عبارت معادل هم باز غیر ممکن میشه
پسورد های برگشت پذیر نیستند بنابر این هر بار که کسی پسوردش و فراموش کنه باید یک پسورد جدید براش ایجاد کنید

pirmard66
سه شنبه 01 اسفند 1391, 02:24 صبح
ممنون شهریار جان...

البته فکر نمیکنم اگر کد رو اینکلود کنیم فشاری به سرور بیاره...

خب چطوری پسورد جدید براش بزارم؟؟؟

هنگم!!!!:گیج:

shahriyar3
سه شنبه 01 اسفند 1391, 02:30 صبح
ممنون شهریار جان...

البته فکر نمیکنم اگر کد رو اینکلود کنیم فشاری به سرور بیاره...

خب چطوری پسورد جدید براش بزارم؟؟؟

هنگم!!!!:گیج:
منظورم از فشار به سرور باری هست که به cpu تحمیل میشه برای پردازش بر روی رشته ها
ربطی به اینکلود کردن نداره!
یک پسورد ایجاد میکنید به هر روشی که دوست داشتی مقدارش و جایگزین میکنی به مقدار فعلی که در دیتابیس هست
قبل از اینکه از این روش خودت برای crypte استفاده کنی مقدار خام پسورد و برای کاربر ایمیل میکنی
کلا قبل از crypte کردن ایمیل میکنید پسورد و

pirmard66
سه شنبه 01 اسفند 1391, 02:33 صبح
ممنونم از شهریار عزیز...

متوجه شدم

حالا به نظرت کلاسی که رضا در بالا نوشته بود بیشتر فشار میاره به سرور یا کد های من؟؟؟

از لحاظ امنیت چه تفاوتی دارن؟؟؟:متفکر:

بازم تشکر از دوستان عزیز:لبخند:

shahriyar3
سه شنبه 01 اسفند 1391, 02:47 صبح
حالا به نظرت کلاسی که رضا در بالا نوشته بود بیشتر فشار میاره به سرور یا کد های من؟؟؟

از لحاظ امنیت چه تفاوتی دارن؟؟؟:متفکر:

بازم تشکر از دوستان عزیز:لبخند:

تابع time که استفاده کردی خوب نیست ببین بردار بجاش از strtotime("one years ago") یه همچین چیزی استفاده کن بهتر جواب میده :قهقهه:

siavashsay
سه شنبه 01 اسفند 1391, 10:07 صبح
$pass=md5(sha1($pass));

به کررات گفته شده که استفاده از 2 الگوریتم هش درست و بجا نیست ! چرا که از قدرت اون الگوریتم کم میکنه !

pirmard66
سه شنبه 01 اسفند 1391, 13:09 عصر
به چه دلیل کم میکنه ؟؟؟

دادا سیاوش میشه بیشتر توضیح بدی؟؟؟


:متفکر: یعنی الان یه هکر میتونه این pass رو کرک کنه؟؟؟

به نظرم که امکان نداره..!:خجالت:

rezaonline.net
سه شنبه 01 اسفند 1391, 17:39 عصر
هر چه تعداد کاراکترهایی که هش تولید میکنه بیشتر باشه ، درصد احتمال هش یکسان برای دو کلمه متفاوت پائینتر میاد .
الان sha256>sha1>md5