# زبان های اسکریپتی > PHP > امنیت در PHP >  بهترین گزینه برای رمز کدام است md5 یا sha یا crc32 یا hash

## hamidhassas

من میخوام یک رمز عبور را کد کذاری کنم و بعد اون رو زخیره کنم به صورتی که امنیت اون بالا باشه کدام یک از متد های زیر بهترین گزینه هست و اصلا تفاوت های اونها در چیه و چطور میشه ازشون استفاده کرد؟
md5_file() - Calculates the md5 hash of a given file
sha1_file() - Calculate the sha1 hash of a file
crc32() - Calculates the crc32 polynomial of a string
sha1() - Calculate the sha1 hash of a string
hash() - Generate a hash value (message digest)

----------


## numberone1

بهترین روش ترکیب چند الگوریتم با هم به اضافه یک salt هست. 
salt میتونه یک کلید اختصاصی یا رندوم باشه

----------


## masiha68

md5  و  sha1  که لو رفتن
بقیه هم زیاد اطلاع ندارم :)

من از ترکیب کردن چندتا از اینا استفاده می کردم با یه نمک قوی و تقریبا پسوردهای قویی ارائه میداد
الان هم که با sha256  کار می کنم

----------


## MMSHFE

آقا کی گفته MD5 و SHA1 لو رفتن؟ ابداً اینطور نیست. علت اینکه میگن ضعیف هستن هم اینه که اکثر سایتها دیکشنریهای قدرتمندی از رمزها و نسخه خام اونها دارن که بصورت Lookup Table ازشون استفاده میکنن تا بگن رمزی که وارد شده، معادل چه متن خامی هست نه اینکه این الگوریتم برگشت پذیر باشن یا لو رفته باشن. همون MD5 و SHA1 هم با ترکیب Salt و Pepper مناسب و تکنیکهای Key Stretching مثل Multiple Hash و... قادر به تولید رمزهای قدرتمند و غیرقابل شکستن هستن. برای مثال، شما رمزی که با این تابع تولید میشه رو اگه تونستین بشکنید (با تمام سایتهای موجود برای این کار)، من حرفتون رو قبول میکنم:
function HashPassword($password, $salt) {
    for($i = 1; $i < 1000; $i++) {
        $password = md5('www.i-nahad.ir' . $password . $salt);
    }
    return $password;
}

----------


## Veteran

function HashPassword( $pw ) {
        for($i = 0; $i < 40000; $i++) {
            $pw = md5(md5(md5(base64_encode($pw . $pw . 'veteran' . $i) . $pw . $i * 5000 . md5($i))));
        }
        return $pw;
    }

من از این استفاده میکنم.

----------


## masiha68

> function HashPassword( $pw ) {
>         for($i = 0; $i < 40000; $i++) {
>             $pw = md5(md5(md5(base64_encode($pw . $pw . 'veteran' . $i) . $pw . $i * 5000 . md5($i))));
>         }
>         return $pw;
>     }
> 
> من از این استفاده میکنم.


اگه همزمان صداتا هش توی سیستم انجام بشه میشه یه حلقه ی 40000*100 که سیستم رو کند می کنه
همون 20-30 بار حلقه اجرا بشه کافیه و اینکه هیچوقت از عدد رند برای تکرار حلقه استفاده نکن
و اقای شهرکی ... توی سایت پی اچ پی نوشته از اینا استفاده نکنید و لو رفتنم هم تقریبا یعنی همین ...که یکی بتونه پسورد هش شده ی شما رو بدست بیاره ... حالا شما میاین یکم کار رو سخت می کنین ولی به هر حال توصیه شده از اینا استفاده نشه

----------


## سوداگر

اگه بیاییم مثلاً 8 کاراکتر خاص از md5 یه کلمه رو ذخیره کنیم کسی میتونه اون رو decript کنه؟ چون برای استفاده از سایتهایی که decript میکنن به تمام 32 حرف نیاز داریم! خیلی وقته برام سواله امنیت این روش چجوریاست؟

----------


## masiha68

> اگه بیاییم مثلاً 8 کاراکتر خاص از md5 یه کلمه رو ذخیره کنیم کسی میتونه اون رو decript کنه؟ چون برای استفاده از سایتهایی که decript میکنن به تمام 32 حرف نیاز داریم! خیلی وقته برام سواله امنیت این روش چجوریاست؟


اینم یه روشیه ... ولی با همون کاری که اقای شهرکی انجام دادن هم میشه هش های خوبی تولید کرد که دیکریپت کردنشون چند ماه وقت بخاد و اکثر سایت هایی که ما می سازیم ارزش اینقد وقت صرف کردن رو نداره

----------


## Unique

> با همون کاری که اقای شهرکی انجام دادن هم میشه هش های خوبی تولید کرد که دیکریپت کردنشون چند ماه وقت


دوست عزیز. این ها hash هستند ! برگشت پذیر نیستند. سایت هایی که توی اینترنت این کار را انجام میدهند در واقع از اطلاعاتی که توی جدوال دارند یک select میگیرند ! مثلا میدونند md5 رشته ۱۲۳۴ چی میشه ! ولی کسی قادر به کشف اون از روی خود md5 به صورت معکوس نیست !

روشی که جناب شهرکی گفتند کاملا تایید میشه ! در ضمن مگه شما برای NSA برنامه مینویسین ؟ میدونین هستند خیلی از سایت های معروف که هنوز کلمه عبور را به صورت غیر hash شده ذخیره میکنند ؟ من نمیگم اینطوری عمل کنین اما گیر ندین ! اون مطلبی هم که توی سایت php هست منظورش یکبار hash کردن رشته بوده !

----------


## Unique

حالا که بحثش گرمه. توصیه میکنم پسورد ها را با توابعی مثل hash_pbkdf2 یا password_hash تبدیل به hash کنید. این توابع برای همین منظور تولید شدند و اون قضیه تکرار hash را رعایت میکنند.
یکی دیگه از موضوعات خیلی مهم اینه که کاربر را ملزم کنید طول password ش بیش از ۶ باشه و حتما از عدد و حروف لاتین بزرگ و کوچیک و علائم استفاده کنه ! میدونم کمی ممکنه اذیت بشه ! اما اگه امنیت تا این حد مهمه بهتره این کار را انجام بدین.

----------


## hamidhassas

چطوری میتونم یک پسوردی که با md5 کد گذاری شده و در دیتابیس زخیره شده رو وقتی از دیتابیس میخونم دیکود کنم و نمایش بدم

مثلا 12345679 کد شده و به صورت 1d25df47er82xf1er44er8 در دیتابیس زخیره شده حالا وقتی میخمام نمایشش بدم بجای 1d25df47er82xf1er44er8 به صورت 123456789 نمایش داده بشه

----------


## Veteran

الگوریتم های هش، غیر قابل برگشت هستند
مثلا نمیشه به طور مستقیم از روی یک هش، مقدار اولیه رو تشخیص داد.
شما باید هش 123 رو با اون مقدار که توی دیتابیش هست مقایسه کنید و اگر مساوی بود، یک کاری انجام بشه

----------


## hamidhassas

من میخوام مثلا مبلغ یک کالایی رو به صورت کد شده زخیره کنم وبعد وقتی کاربر اطلاعات قیمت اون کالا رو به نمایش در میاره مبلغ درست رو ببینه نه کد شده رو

----------


## meysam1366

سلام دوست عزیز

چرا شما میخواید اینکار رو انجام بدید؟

چون تا اونجایی که بنده اطلاع دارم نشون دادن قیمت مشکل امنیتی نداره و دارید خودتون رو اذیت می کنید

----------


## hamidhassas

> سلام دوست عزیز
> 
> چرا شما میخواید اینکار رو انجام بدید؟
> 
> چون تا اونجایی که بنده اطلاع دارم نشون دادن قیمت مشکل امنیتی نداره و دارید خودتون رو اذیت می کنید


بابا مثلا گفتم بیشتر برای اطلاعاتی چون پسورد ، کد ملی ، جواب سوال ها در صورت فراموش شدن رمز عبور ، شماره تلفن های خاصی و محرمانه میخوام

----------


## mfungroup

> بابا مثلا گفتم بیشتر برای اطلاعاتی چون پسورد ، کد ملی ، جواب سوال ها در صورت فراموش شدن رمز عبور ، شماره تلفن های خاصی و محرمانه میخوام


برای فراموش کردن رمز که این کار ها لازم نیست کافیه یه االگوریتم برای تولید رمز جدید درست کنید یا لینک 24 ساعته برای تغییر رمز به ایمیل ارسال کنید

----------


## ashokri.nll

دوستان این همه میگید لو رفته یه لینکی چیزی بدید ما هم با خبر بشیم مگه میشه خود سایت php گفته که اینا قابل decode به راحتی نیست مگه اینکه یکی بیکار باشه بشینه یه تعداد رمز ساده رو کد کنه بعد بگه مثلا 1234 میشه "فلان" ولی کلا دوتا md5 و sha1 رو قاطی کنی هیچ کس هک نمیکنه .
ضمنا خارجی ها که بیکار نیستن بیان سایت ایرانی هک کنن این ایرانیان سایت ایرانی هک میکنن که اونم فکر نکنم به این حد رسیده باشن که بتونن یه همچین کار کنن . 
این که لو رفته واقعا خنده داره به خدا  :لبخند گشاده!:

----------


## Unique

موضوع لو رفتن نیست ! موضوع اینه که الگوریتم مثلا MD5 خیلی سریع تولید میشه و با استفاده کردن از مثلا ۱۰ تا پردازنده کارت گرافیکی های موجود nvidia میشه در هر ثانیه ۱۰۰ میلیون رشته md5 تولید کرد (حالا فرض کن ۱۰۰ تا ابر کامپیوتر چیکار میکنن) و در نتیجه brute force خیلی سریع رمز های شکننده و حتی قوی را پیدا میکنه. حالا اگه ما salt های غیر همسان داشته باشیم و به تعداد زیاد هر hash را دوباره hash کنیم ،‌ زمان بیشتری لازمه تا این hash شکسته بشه. همین

موضوع روشن و مشخصه ، کمی نیاز به تحقیق و بررسی داره.

----------


## کامبیز اسدزاده

نظر من هم استفاده از الگوریتم MD5 همراه با salt هستش.

----------


## hamidhassas

> نظر من هم استفاده از الگوریتم MD5 همراه با salt هستش.


میشه یک مثال بزنید و خیلی ساده توضیح بدین چطوری یاد بگیرم

----------


## eshpilen

> موضوع اینه که الگوریتم مثلا MD5 خیلی سریع تولید میشه و با استفاده کردن از مثلا ۱۰ تا پردازنده کارت گرافیکی های موجود nvidia میشه در هر ثانیه ۱۰۰ میلیون رشته md5 تولید کرد


در حال حاضر با یک کارت گرافیک میشه حداقل چند میلیارد هش md5 در هر ثانیه تولید کرد.

----------


## eshpilen

از نظر علم و اصولش دیگه نباید از MD5 و SHA1 برای هش پسورد استفاده کرد.
اصولا هم این الگوریتم ها از اول هم برای کاربرد هش طراحی نشدن و برای این کار مناسب نیستن.
ولی واسه برنامه های 99% از برنامه نویسان عزیز، مشکلی نداره، چون امنیت برنامشون در کل اونقدری حرفه ای و بالا نیست که نگرانی عمدهء ما هش پسوردشون باشه  :لبخند گشاده!: 
چون میگن امنیت مثل یک زنجیره، که استحکام کل اون برابر استحکام ضعیف ترین حلقهء زنجیره (اگر چند یا حتی اکثریت حلقه های زنجیر خیلی قوی هم داشته باشیم، بازم زنجیر از محل حلقه های ضعیف تر پاره میشه - باید تمام حلقه ها تقریبا به یک اندازه قوی باشن).
البته از هش ساده استفاده نکنید، بلکه یک روشی شبیه اونی که مهندس شهرکی گذاشت استفاده کنید حداقل.
بهرحال بنده در پروژهء خودم از SHA256 استفاده کردم، که حتی اینم حرفه ای نیست، چون برای هش کردن الگوریتم های مخصوص هش و قوی تری وجود دارن.
الگوریتم حرفه ای برای هش bcrypt است و scrypt. البته اینا هم باز یخورده نکات فرعی و جزییاتی داره واسه خودشون که بدون نقص و با امنیت حداکثری پیاده سازی بشن (علم امنیت/رمزنگاری اینقدر گسترده و پیچیده است و نکات زیاد داره که آدم نمیتونه همش رو مدام حتی اشاره کنه).

توصیه تخصصی (برای حرفه ای ها و برنامه های خفن از نظر امنیتی):

MD5 و SHA1 امروزه الگوریتم های شکسته شده و منسوخ بحساب میان و مدتهاست از بیشتر استانداردهای رسمی خارج شدن، هرچند در کاربردهای زیادی هنوز استفاده میشن (و در بعضی کاربردهای خاص واقعا مشکل زیادی هم ندارن)، اما استفاده از اونا در کدها و برنامه های جدید اصلا توصیه نمیشه. این توصیه فقط به کاربرد هش کردن هم محدود نمیشه، بلکه در بقیهء کاربردها (مثل تولید کلیدهای رمزنگاری) هم توصیه نمیشن. البته اگر بقدر کافی در امنیت و رمزنگاری تخصص و اطلاعات و بینش داشته باشید، ممکنه یوقت ها در شرایط و موارد خاصی از این الگوریتم ها استفاده کنید، اما اینم باز توصیه نمیشه و بهتره انجام نشه.

----------


## eshpilen

> function HashPassword($password, $salt) {
>     for($i = 1; $i < 1000; $i++) {
>         $password = md5('www.i-nahad.ir' . $password . $salt);
>     }
>     return $password;
> }


درواقع این الگوریتم هم چندان قوی نیست.
شما فکر کن فقط با یک کارت گرافیک امروزی میشه در هر ثانیه مثلا 3 میلیارد هش md5 رو تولید کرد.
همهء کارهایی که شما کردی، منجمله اینکه عملیات رو 1000 بار تکرار کردی، چقدر میتونن این عملیات رو کند کنن؟
نهایت مثلا 3 میلیارد بر ثانیه تبدیل میشه به 2 میلیون بر ثانیه.
امکان تست 2 میلیون پسورد بر ثانیه، با یک PC معمولی امروزی، بنظرم بازم بیش از حد خطرناک باشه. یعنی درصد قابل توجهی از کاربران ممکنه پسوردهایی داشته باشن که در دیکشنری های بزرگ پسوردهای متداول/قابل حدس موجود باشه یا بسادگی بوسیلهء Brute-force تمام ترکیبات ممکن در یک بازهء خاص، کشف بشن.
مثلا تمام بازهء پسوردهای 8 کاراکتری مرکب از حروف کوچک، اعداد، و چند کاراکتر خاص (_ فاصله * # - + =)، رو میشه در حدود 68 روز تولید کرد! (با همین سرعت 2 میلیون بر ثانیه)
فکر میکنم خیلی از کاربران از پسوردهایی در همین حد یا حتی ضعیف تر استفاده میکنن.
یادمون نره: فقط یک PC معمولی!
اگر از سرورهای قدرتمند/چندین کارت گرافیک/پردازش توزیع شده (چندین رایانه) استفاده بشه، اونوقت این زمان به همون نسبت کمتر میشه.
تازه فرضی که بنده کردم که سرعت تست پسوردها برای کرکر تقریبا به همون نسبت دورهای الگوریتم شما پایین میاد، فرض بقدر کافی مطمئنی نیست از نظر علمی و تخصصی، و احتمالش خیلی کم نیست که در عمل با متدهای خاصی بشه این محدودیت رو خیلی کمتر کرد (یک دلیل این عدم اطمینان هم همینه که این الگوریتم ها توسط متخصصان رمزنگاری و برای کاربرد هش طراحی نشدن). این مسائل یجوری مثل ریاضیات میمونه که یک گزاره ای تا بصورت ریاضی اثبات کامل/بی نقص/روشنی نشه، نمیشه ازش اطمینان کافی پیدا کرد.

----------


## Unique

> در حال حاضر با یک کارت گرافیک میشه حداقل چند میلیارد هش md5 در هر ثانیه تولید کرد.


من کارت گرافیک قدیمی خودمو گفتم ;). کلا قصدم این بود که خواننده متوجه بشه چه راحت این کد ها generate میشوند.

تا اونجا که من میدونم بهترین روش استفاده از PBKDF2  هست که php ازش پشتیبانی میکنه و توابع مجرا هم اینجا هست اگه کسی نتونه روی سرور خودش نصب کنه. در ضمن PBKDF2 توسط NIST برای password storage تایید شده.

----------


## کامبیز اسدزاده

> میشه یک مثال بزنید و خیلی ساده توضیح بدین چطوری یاد بگیرم


شاید این مفید باشه : http://www.sitepoint.com/password-hashing-in-php/

----------


## Mori Bone

سلام من از روش bcrypt زیر استفهده می کنم آیا این روش حرفه ایه؟ اگه نه حرفه ای ترین راه را پیشنهاد کنید! ممنون :تشویق: 

class Bcrypt()
{
    function generateHash( $password )
    {
        if( defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH ){
            $salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
            return crypt( $password , $salt );
        }
    }
    function verify( $password , $hashedPassword )
    {
        return crypt( $password , $hashedPassword ) == $hashedPassword;
    }
}


این چی؟
class Bcrypt {
  private $rounds;
  public function __construct($rounds = 12) {
    if(CRYPT_BLOWFISH != 1) {
      throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
    }

    $this->rounds = $rounds;
  }

  public function hash($input) {
    $hash = crypt($input, $this->getSalt());

    if(strlen($hash) > 13)
      return $hash;

    return false;
  }

  public function verify($input, $existingHash) {
    $hash = crypt($input, $existingHash);

    return $hash === $existingHash;
  }

  private function getSalt() {
    $salt = sprintf('$2a$%02d$', $this->rounds);

    $bytes = $this->getRandomBytes(16);

    $salt .= $this->encodeBytes($bytes);

    return $salt;
  }

  private $randomState;
  private function getRandomBytes($count) {
    $bytes = '';

    if(function_exists('openssl_random_pseudo_bytes') &&
        (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL is slow on Windows
      $bytes = openssl_random_pseudo_bytes($count);
    }

    if($bytes === '' && is_readable('/dev/urandom') &&
       ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
      $bytes = fread($hRand, $count);
      fclose($hRand);
    }

    if(strlen($bytes) < $count) {
      $bytes = '';

      if($this->randomState === null) {
        $this->randomState = microtime();
        if(function_exists('getmypid')) {
          $this->randomState .= getmypid();
        }
      }

      for($i = 0; $i < $count; $i += 16) {
        $this->randomState = md5(microtime() . $this->randomState);

        if (PHP_VERSION >= '5') {
          $bytes .= md5($this->randomState, true);
        } else {
          $bytes .= pack('H*', md5($this->randomState));
        }
      }

      $bytes = substr($bytes, 0, $count);
    }

    return $bytes;
  }

  private function encodeBytes($input) {
    // The following is code from the PHP Password Hashing Framework
    $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx  yz0123456789';

    $output = '';
    $i = 0;
    do {
      $c1 = ord($input[$i++]);
      $output .= $itoa64[$c1 >> 2];
      $c1 = ($c1 & 0x03) << 4;
      if ($i >= 16) {
        $output .= $itoa64[$c1];
        break;
      }

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 4;
      $output .= $itoa64[$c1];
      $c1 = ($c2 & 0x0f) << 2;

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 6;
      $output .= $itoa64[$c1];
      $output .= $itoa64[$c2 & 0x3f];
    } while (1);

    return $output;
  }
}
کدهای دوم از http://stackoverflow.com/questions/4...sswords-in-php است

----------


## Mori Bone

کسی نیس تاپیک قبلی رو جواب بده؟ :افسرده:

----------


## Mori Bone

کسی جواب نمیده ؟

----------


## eshpilen

> تا اونجا که من میدونم بهترین روش استفاده از PBKDF2  هست که php ازش پشتیبانی میکنه و توابع مجرا هم اینجا هست اگه کسی نتونه روی سرور خودش نصب کنه. در ضمن PBKDF2 توسط NIST برای password storage تایید شده.


تاجاییکه بنده میدونم، PBKDF2 با اینکه توسط NIST استاندارد شده، ولی بهتر از bcrypt نیست، و درواقع بعکس، bcrypt قوی تر از PBKDF2 است.
در تمام منابعی که تاحالا خوندم bcrypt رو توصیه کردن و نه PBKDF2 رو (وقتی اشاره به bcrypt هم شده). بعضی وقتا هم صراحتا به قوی تر بودن bcrypt نسبت به PBKDF2 اشاره کردن.
فکر کنم PBKDF2 با اینکه استاندارد شده اما الان آلترناتیوهای خیلی قوی تری مثل bcrypt و scrypt هست. PBKDF2 بنظرم قدیمیه و صرف اینکه یه زمانی توسط NIST بعنوان استاندارد معرفی شده (الان نمیدونم وضعیتش از نظر رسمی یا غیررسمی در دید NIST چیه)، دلیل نمیشه که بگیم در حال حاضر هم بهترین الگوریتم برای هش کردن پسورد است (ضمن اینکه قابل قبول/استاندارد بودن، از دید رسمی یا غیررسمی، با بهترین بودن تفاوت میکنه).
محاسبات اشاره شده در این مقاله هم نشون میدن که در کل bcrypt از PBKDF2 به نحو قابل توجهی بهتر عمل میکنه: http://www.hamidreza-mz.tk/?p=506

----------


## Mori Bone

> سلام من از روش bcrypt زیر استفهده می کنم آیا این روش حرفه ایه؟ اگه نه حرفه ای ترین راه را پیشنهاد کنید! ممنون
> 
> class Bcrypt()
> {
>     function generateHash( $password )
>     {
>         if( defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH ){
>             $salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
>             return crypt( $password , $salt );
> ...


جواب می خوام

----------


## سوداگر

اگه امکان داره به این سوال بنده حقیر هم جواب بدین و از کلمه شاید و اینها هم استفاده نکنید  :لبخند:  درسته امنیت نسبیه ولی اینقدر هم شاید نداره (حداقل واسه رمزنگاری)



> اگه بیاییم مثلاً 8 کاراکتر خاص از md5 یه کلمه رو ذخیره کنیم کسی میتونه اون رو بدست بیاره؟ چون برای بدست آوردن اصل پسوردی که مثلاً به صورت MD5 ذخیره شده به تمام 32 حرف نیاز داریم! امنیت این روش چجوریاست؟


تشکر  :تشویق: 
(-------
هرچند کسی که علمش رو داشته باشه و بخواد نفوذ بکنه کار خودش رو میکنه برای سایتهایی که یکنفره ساخته شدن و به نظرم اینجوری نیست که یارو به در بسته بخوره و پا پس بکشه. چند وقت پیش پلیس فتا یه نوجوان زیر 18 سال رو به خاطر هک کردن سایت های ایرانی و فروختن اطلاعات کاربرها دستگیر کرده بود ازش پرسید وضعیت امنیت سایتهای ایرانی رو چطوری دیدی؟ گفت: متوسط رو به پایین (40 درصد مسائل امنیتی لحاظ میشه و اکثراً از اون 60 درصد غافل اند). به نظرم رمزنگاری جزو اون 60 درصده....
-------)

----------


## eshpilen

حضراتی که سوالاتی کردن و جواب میخوان عجله نکنن. نیاز به تحقیق و بررسی و وقت بیشتری داره، بنده هم که سرم شلوغه. سعی میکنم در اولین فرصت یکسری مقاله ها رو دوباره مرور کنم و کدها رو هم نگاه و فکر کنم و جواب بدم. کار میبره  :چشمک:

----------


## eshpilen

> اگه بیاییم مثلاً 8 کاراکتر خاص از md5 یه کلمه رو ذخیره کنیم کسی میتونه  اون رو بدست بیاره؟ چون برای بدست آوردن اصل پسوردی که مثلاً به صورت MD5  ذخیره شده به تمام 32 حرف نیاز داریم! امنیت این روش چجوریاست؟


گفتم اول این سوال رو جواب بدم تا دارم میرم خونه (سر کارم)، چون راحتتر و کوتاهتره جوابش.
اگر شما بیای و 8 کاراکتر از 32 کاراکتر خروجی هگز md5 رو جدا کنی و در دیتابیس خودت فقط اون 8 کاراکتر رو ذخیره کنی چی میشه؟
خب اول از نظر امنیت سایت خودت خیلی بد میشه!
چرا؟
چون شانس تصادم هش ها رو به شدت بالا میبری.
خروجی باینری md5 برابر با 128 بیت (16 بایت) است که شما بطور معمول در قالب 32 کاراکتر هگز مشاهده میکنی (هر دو کاراکتر هگز نمایندهء مقدار یک بایت (8 بیت) باینری هستن).
تعداد حالتهای ممکن برای این هش برابر 2 به توان 128 است که عدد خیلی بزرگیه و هیچ کرکری در دنیا نمیتونه تمام این حالتها یا حتی کسری غیرناچیز از اون رو تست کنه.
خروجی ای که شما با استفاده از فقط 8 کاراکتر از 32 کاراکتر داری برابر 4 بایت یا 32 بیت باینری میشه، که بنابراین تعداد حالتهای ممکنش 2 به توان 32 است (حدود 4 میلیارد حالت).
میدونی این یعنی چی؟ یعنی پسورد کاربر هرچی که باشه، حتی قوی ترین پسوردهای دنیا، تعداد هش های ممکن سیستم شما حدود 4 میلیارد بیشتر نیست، و این یک فاجعهء امنیتیه!
در نفوذ به سیستم شخص شما، کرکر نیازی نداره که پسورد اصلی رو که کاربر انتخاب کرده بوده بدست بیاره، بلکه کافیه یک رشته ای رو بدست بیاره که 8 کاراکتر اول از هشی که تولید میکنه برابر با همون 8 کاراکتر هش پسورد کاربر باشه، که اینم نهایتش با تست حدود 4 میلیارد رشتهء ورودی میتونه بدست بیاره.
بنابراین کرکر میتونه برای هر هش موجود در دیتابیس شما، پسوردی رو بدست بیاره که بتونه باهاش بجای کاربر مورد نظر لاگین کنه. دقت کنید این پسورد لزوما پسوردی که کاربر انتخاب کرده بوده نیست، بلکه صرفا رشته ای است که 8 کاراکتر از هش اون با 8 کاراکتر از هش پسورد اصلی کاربر یکسان است.
ضمنا دقت کنید که نیازی نیست این 8 کاراکتر حتما ترتیب خاصی داشته باشن و از ابتدا یا انتها یا وسط و هرجای خاص از هش اصلی جدا شده باشن. بهرحال شما 8 کاراکتر رو از یک هش به هر صورتی جدا کنی و فقط از همین 8 کاراکتر برای احراز هویت کاربر استفاده کنی، نتیجه همین فاجعه میشه!
بنابراین بخاطر سایت و کاربران خودتون، همچین کاری نکنید.
هرچند بله هکر اونوقت احتمالا نمیتونه پسورد اصلی کاربر رو بدست بیاره (چون تمام هش رو نداره - و البته به شرطی که پسورد کاربر بیش از حد ضعیف نبوده باشه) و بنابراین نمیتونه به اکانتهای دیگر کاربر در سایتهای دیگر به این واسطه نفوذ کنه، ولی بهرحال به سایت خودتون که میتونه نفوذ کنه، چون به همین شکل مثل هکر، شما هم نمیتونید میان پسورد اصلی کاربر و رشته های دیگری که فقط اون چند کاراکتر از هش اونا با هش پسورد کاربر مورد نظر یکسان درمیاد تفاوتی قائل بشید.

----------


## Mori Bone

> حضراتی که سوالاتی کردن و جواب میخوان عجله نکنن. نیاز به تحقیق و بررسی و وقت بیشتری داره، بنده هم که سرم شلوغه. سعی میکنم در اولین فرصت یکسری مقاله ها رو دوباره مرور کنم و کدها رو هم نگاه و فکر کنم و جواب بدم. کار میبره


سلام و ممنون از این همه اطلاعاتی که در اختیار همه می گذارید به صورت مجانی البته خیرخواهانه
میشه این مقالاتی که می خواهید بخونید رو برای ما هم بگذارید؟

لطفا به سوال من در هم جواب دهید

----------


## سوداگر

منظورم صرف 8 کاراکتر نبود (از قلمم یهو پرید!) ... منظورم اینه که چیزی غیر از 32 حرف باشه حالا شما 16 حرفش کن، یه چیزی غیر از 32 
یا مثلا کاراکترهای md5 و sha رو لابه لای همدیگه قرار بدیم و در نهایت 32 حرف ذخیره بشه با همون تعداد حالتهای ممکن برای md5....
این رو گفتم چون سرعت تولیدش بیشتر از حلقه تکرار هست...

----------


## majid1605

function UniqueSalt($ID = NULL, $Length = NULL)
{
    $ID = ($ID == NULL) ? uniqid(rand(), TRUE) : $ID;
    $Salt  = uniqid(hash("sha256",$ID),TRUE);
    $Unique_Code = hash("sha256", $ID.$Salt);
    return $Length == NULL ? $Unique_Code : substr($Unique_Code, $Length);
}

من یکی از این تابع واسه تولید salt استفاده می کنم بعدش با sha256 هم هش پسورد رو انجام میدم

----------


## eshpilen

> سلام و ممنون از این همه اطلاعاتی که در اختیار همه می گذارید به صورت مجانی البته خیرخواهانه
> میشه این مقالاتی که می خواهید بخونید رو برای ما هم بگذارید؟


مقالهء خاصی نبود؛ امثال همین لینک هایی که کاربران بعضی وقتا میذارن. گفتم بخونم یه مرور و یادآوری مجدد بشه برام.




> لطفا به سوال من در هم جواب دهید


دیشب که وقت کردم حداقل 2 ساعت روش کار کردم.
دوتا کلاس گذاشتید. یکیش مختصر و دیگری مفصل.
اونی که مختصره، الگوریتم رندومش غیراصولیه.
اونی که مفصله هم بد نیست ولی بنظر بنده باز جای کار داره و دارم روش کار میکنم. قضیه یک مقدار پیچیده و حجیم شد و نیاز به تحقیق بیشتری داره که بتونم کد نهایی ارائه کنم؛ میخوام برم توی سایتهای stackexchange و این حرفا در بعضی مواردش یه چیزایی بپرسم. ممکنه مدتی طول بکشه. بهرحال اگر شما عجله داری میتونی از همون کلاس استفاده کنی.

----------


## eshpilen

> منظورم صرف 8 کاراکتر نبود (از قلمم یهو پرید!) ... منظورم اینه که چیزی غیر از 32 حرف باشه حالا شما 16 حرفش کن، یه چیزی غیر از 32 
> یا مثلا کاراکترهای md5 و sha رو لابه لای همدیگه قرار بدیم و در نهایت 32 حرف ذخیره بشه با همون تعداد حالتهای ممکن برای md5....
> این رو گفتم چون سرعت تولیدش بیشتر از حلقه تکرار هست...


همش ایراد داره.
قاطی کردن چندتا هش خوب نیست.
فرض بر پنهان ماندن الگوریتم هم نکنید، چون میشه امنیت از طریق تیرگی، که بطور معمول اصولی نیست.
همیشه فرض کنید هکر کل و جزییات الگوریتم شما رو داره/میدونه و خوب بهش درک و احاطه داره.
حتی خودتون هم نباید بتونید به این سادگی (فقط با دونستن الگوریتم) ضعفی از الگوریتم خودتون بدست بیارید.
تعداد کاراکترها رو هم هرچی کم کنید بهرحال یک طرف ضعیف میشه. یک طرف درجهء سختی رسیدن از هش به پسورد اصیله، طرف دیگر درجهء سختی پیدا کردن رشته ای که اون قسمت از هش اون برابر همون بخش از هش شما بشه. طول رو کم کنی، احتمال پیدا کردن اصل پسورد کمتر میشه ولی احتمال ایجاد تصادم در هش ها و پیدا شدن رشته ای با هش یکسان بیشتر میشه.
16 هم بگیری، بهرصورت از اون سمت هم احتمال کشف اصل پسورد رو به همون نسبت کلی زیاد کردی، درحالیکه از این سمت هم احتمال تصادم هش وجود داره (خیلی بیش از حالت و محاسبات استاندارد). اینطوری میشه روزهء شک دار. نه از این طرف مطمئنی و نه از اون طرف.
حالا جزییات و تحلیل و مثالهای عینی ترش بماند چون وقتش نیست و فکر نکنم زیاد هم نیاز باشه. بهرحال این رو درنظر بگیر که اونایی که الگوریتم های هش استاندارد رو طراحی کردن متخصص بودن و با کلی تحقیق و بررسی و تایید چنین الگوریتم هایی با چنین خصوصیاتی (منجمله طول خروجی اونا)، نهایی شدن. طول خروجی روی حساب و کتابی هست و اگر شما درش دست ببری، اون حساب و کتاب رو بهم میزنی و دیگه تضمین های تئوریک که داده شدن برقرار نیستن مگر اینکه دوباره تحلیل و بررسی و اثبات صورت بگیره به شکلی که بفهمی بقدر کافی اطمینان بهش هست، که اونم کار میبره و فرایند و منابع میخواد و باید افراد متخصص دارای دانش و صلاحیت کافی این کار رو بکنن.

----------


## eshpilen

تاپیک اختصاصی درمورد الگوریتم bcrypt بعنوان بهترین الگوریتم متداول درحال حاضر برای هش پسورد: bcrypt - الگوریتم هش پسورد حرفه ای

راستی این تاپیک هم باید به تالار امنیت منتقل بشه.

----------


## MMSHFE

> راستی این تاپیک هم باید به تالار امنیت منتقل بشه.


تاپیک منتقل شد.

----------


## engmmrj

*eshpilen*



> ولی واسه برنامه های 99% از برنامه نویسان عزیز، مشکلی نداره، چون امنیت  برنامشون در کل اونقدری حرفه ای و بالا نیست که نگرانی عمدهء ما هش  پسوردشون باشه


شما همش درباره ضعیف بودن امنیت برنامه ها حرف میزنید ! یکبار بیاین روی سایت بنده یا سایت های دیگر تست امنیت کنید ببینیم چقدر حرف حاتون صحت !

----------


## eshpilen

> *eshpilen*
> 
> شما همش درباره ضعیف بودن امنیت برنامه ها حرف میزنید ! یکبار بیاین روی سایت بنده یا سایت های دیگر تست امنیت کنید ببینیم چقدر حرف حاتون صحت !


این کارها رو که بقدر کافی تاحالا افرادی بوده و هستن و انجام میدن. حتی جوجه هکرها!
بهرحال هرچیزی وقت خودش رو میخواد. اونی که میره همش سروقت کارهای نه چندان سطح بالا روی سایتهای نه چندان سطح بالای ملت، همین سطح سواد و کارها هم عایدش میشه. من میخواستم برم روی این کارها و چیزا فوکوس کنم الان در این سطح و سواد خاص نبودم.
ضمنا درحال حاضر دو جا کار میکنم و وقت زیادی ندارم. باید به اولویت های خودم برسم.
یه توصیه ای هم میکنم اینه که سعی کنید توان تحلیل و درک تئوری خودتون رو بالا ببرید، چون خیلی چیزها رو یاد گرفتن و فهمیدن از طریق تئوریه یا از طریق تئوری خیلی بهینه تره. بعضی موارد اصلا امکانش نیست یا در دسترس هرکسی نیست که تست و تجربهء عملی بکنه، و یا حداقل خیلی دشوار و هزینه بره و صرف نمیکنه. اینا رو باید تئوریش رو بتونی بفهمی. وقتی از نظر تئوری خوب روشن بشی و قوی باشی، خودبخود نیاز به تست عملی چیزهای نسبتا پیش پا افتاده در نظرت از بین میره.
فرض کنید مثلا منم بلد نیستم الگوریتم Brute-force هش رو ببرم روی FPGA، ولی کلیتش رو میدونم که چنین چیزی هست و زیاد هم سخت نیست (واسه افراد باسواد)، و میدونم باید دربرابر این مسئله تمهید بکنم. آیا نیاز هست حتما خودم این کار رو عملی انجام بدم تا بفهمم و براش راهکار پیاده کنم؟ البته اگر وقت بشه آدم همهء اینا رو یاد بگیره و عملی هم کار و تست کنه که خیلی خوبه، ولی اینقدر دانش و مهارت ها وسیع هستن و عمر و وقت آدم محدوده که نمیشه همه چیز رو همزمان یاد گرفت و تست کرد. هرچند من سعی میکنم هرچیزی رو تاحدی که میتونم یاد بگیرم و درک کنم، ولو صرفا از نظر تئوری و پایه و آماده بودن.

البته در زمینهء هک و این قبیل مسائل چند مورد محدودی هم بوده که کارهایی کردم و عجیب نبوده که در این چند مورد محدود خیلی راحت و سریع دفهء اول و بدون هیچ کمکی از کس دیگری یا استفاده از نرم افزارهای آماده، تونستم به نتیجه برسم و نتیجه هم با تئوری و پیشبینی خودم حداکثر هماهنگی رو داشته.

----------


## engmmrj

> این کارها رو که بقدر کافی تاحالا افرادی بوده و هستن و انجام میدن. حتی جوجه هکرها!
> بهرحال هرچیزی وقت خودش رو میخواد. اونی که میره همش سروقت کارهای نه چندان سطح بالا روی سایتهای نه چندان سطح بالای ملت، همین سطح سواد و کارها هم عایدش میشه. من میخواستم برم روی این کارها و چیزا فوکوس کنم الان در این سطح و سواد خاص نبودم.
> ضمنا درحال حاضر دو جا کار میکنم و وقت زیادی ندارم. باید به اولویت های خودم برسم.
> یه توصیه ای هم میکنم اینه که سعی کنید توان تحلیل و درک تئوری خودتون رو بالا ببرید، چون خیلی چیزها رو یاد گرفتن و فهمیدن از طریق تئوریه یا از طریق تئوری خیلی بهینه تره. بعضی موارد اصلا امکانش نیست یا در دسترس هرکسی نیست که تست و تجربهء عملی بکنه، و یا حداقل خیلی دشوار و هزینه بره و صرف نمیکنه. اینا رو باید تئوریش رو بتونی بفهمی. وقتی از نظر تئوری خوب روشن بشی و قوی باشی، خودبخود نیاز به تست عملی چیزهای نسبتا پیش پا افتاده در نظرت از بین میره.
> فرض کنید مثلا منم بلد نیستم الگوریتم Brute-force هش رو ببرم روی FPGA، ولی کلیتش رو میدونم که چنین چیزی هست و زیاد هم سخت نیست (واسه افراد باسواد)، و میدونم باید دربرابر این مسئله تمهید بکنم. آیا نیاز هست حتما خودم این کار رو عملی انجام بدم تا بفهمم و براش راهکار پیاده کنم؟ البته اگر وقت بشه آدم همهء اینا رو یاد بگیره و عملی هم کار و تست کنه که خیلی خوبه، ولی اینقدر دانش و مهارت ها وسیع هستن و عمر و وقت آدم محدوده که نمیشه همه چیز رو همزمان یاد گرفت و تست کرد. هرچند من سعی میکنم هرچیزی رو تاحدی که میتونم یاد بگیرم و درک کنم، ولو صرفا از نظر تئوری و پایه و آماده بودن.
> 
> البته در زمینهء هک و این قبیل مسائل چند مورد محدودی هم بوده که کارهایی کردم و عجیب نبوده که در این چند مورد محدود خیلی راحت و سریع دفهء اول و بدون هیچ کمکی از کس دیگری یا استفاده از نرم افزارهای آماده، تونستم به نتیجه برسم و نتیجه هم با تئوری و پیشبینی خودم حداکثر هماهنگی رو داشته.


به این جور آدم ها میگن زنبور بدون عسل

----------


## Mori Bone

جوابه سواله منو نمی دید

----------


## eshpilen

> به این جور آدم ها میگن زنبور بدون عسل


به امثال جنابعالی هم میگن نادان و مغلطه باز!
اصلا معلوم نیست منطقت چیه چی میخوای چی میگی چه ربطی چطوری به چی داره چطوری چی رو ثابت یا رد میکنه.
حرف حسابت چیه؟
میگی باید حتما سایت هک کرده باشم یا هک کنم یا بتونم هک کنم که دربارهء چه چیزهایی اظهار نظر کنم؟ ربطش چیه اونوقت؟
و ربطش به این بحث چی بود؟
هک خیلی فرق میکنه با خیلی مباحث دیگر، باوجودی که همشون تحت عنوان امنیت که مقولهء وسیعی است دسته بندی میشن.
هک داریم، از یک طرف دیگر بحث برقراری امنیت رو داریم (هرچند این با هک اشتراکات قابل توجهی داره)، بعد بحث علم رمزنگاری هم هست.
هرکدام از اینا کم و بیش با هم اشتراکاتی دارن اما خیلی جاها و متخصصان اونا هم از هم جدا هستند به دلایل مختلف.
مثلا بزرگترین متخصصان و دانشمندان و مراجع علم رمزنگاری در دنیا، آیا همشون هکر هستن و هکری کردن و هک کردن بلدن؟
آیا بهترین الگوریتم ها و پروتکل های رمزنگاری، مثل همین بحث هش پسورد bcrypt یا scrypt، رو هکرها درست کردن یا اون متخصصان و دانشمندان برجسته که درس آکادمیک و تئوریک تخصصیش رو خوندن؟
یا شاید شما ادعا میکنی که دنیا در اشتباهه و اینا بهترین الگوریتم های هش نیستن و هکرها یا شما بهترش رو درست کردن؟
الگوریتم AES و RSA رو هم که سالهاست جزء قویترین و پرکاربردترین الگوریتم ها بودن، کیا درست کردن؟
شما میای به این اشخاص میخوای بگی راست میگید و اگر خیلی بارتونه بیاید نشون بدید و چندتا سایت واسه ما هک کنید؟! بنظرت این استدلال و درخواست منطقی ای است؟
شما از اول حرفی که زدی مغلطه بود، که مقداری ابهام و کلی گویی هم داشت.
بلد نیستی یک حرف و گزارهء منطقی رو روشن و دقیق و مربوط بیان کنی، بعد فکر میکنی کی هستی اصلا در سطحی هستی که بتونی دربارهء امثال من که هزار برابر امثال تو مطلب و مقاله های علمی سطحی بالا که جنابعالی احتمالا نمیتونی حتی چند خطش رو بخونی و بفهمی خوندن و درک کردن، قضاوت کنی و به تمسخر بگیری با اینطور مغلطه های صدمن یک غاز؟
بهتره بجای اینکه در فکر این کل کل های مسخره در سطح خودت و امثال خودت باشی، چشمات رو باز کنی و ببینی که واقعیت خیلی گسترده تر از دنیای محدود شماست و افراد مختلفی با دانش و بینش و توانایی ها و سطوح مختلفی وجود دارن.
شما میتونید از دانش من استفاده کنید، میتونید نکنید، ولی درحدی نیستی که بتونی دربارهء دانش و صلاحیت من قضاوت کنی، و حق نداری با مغلطه اندازی و کل کل چاله میدانی دیگران رو از دانستن و یادگیری و استفاده از منابع دیگر بازبداری.

بنده در مواردی که بلد هستم و احاطه دارم دانش و نظر تخصصی خودم رو در اختیار عموم میذارم. یادم نمیاد جایی ادعایی کرده باشم و نظر و فتوایی فراتر از دانش و توانایی و صلاحیت خودم داده باشم. چیزهایی هم که تاحالا گفتم و میگم، همه بر اساس مطالعات و تحقیق گسترده در طول سالها از منابع گسترده و باکیفیتی بوده و فقط حرف من نیست بلکه براش منابع و افراد متعدد و معتبری وجود داره که بعضا بهشون اشاره کردم و لینک یا ترجمه هم دادم. حالا شما بر چه اساسی چه حرف حسابی داری در این موارد، روشن و دقیق بفرما تا بررسیش کنیم.
درمورد بحث این تاپیک الان حرف خاصی داری؟
یا هنوزم رو استدلال خودت پافشاری داری که هرکس درمورد هر مسئله ای در دنیای وسیع امنیت میخواد ادعا کنه و صلاحیت داشته باشه باید حتما هکر به اون شکلی که مد نظر شماست باشه و به اون شکلی که مد نظر شماست اون رو ثابت کنه؟

یکی استاد دانشگاهه، یکی مهندس، یکی یه کاره دیگه. همهء اینا دانش و بینش و توانایی و مهارتهای خاص خودشون رو دارن. یک چیزهایی هست که بیشتر یا همش از راه تئوریه، یه چیزهای دیگری هست که بیشتر یا همش عملی، یه چیزهایی که 50% تئوری و 50% عملی.
شما با یک حرف صدمن یک غاز چاله میدانی اومدی همهء اینا رو میخوای توی یک ظرف کوچک خودت جا بدی و با قالب محدود خودت قیاس کنی. فکر کردی کی هستی مثلا مرجع علم هستی یا دستگاه تایید صلاحیت و اعتبار دادن به همهء اینا؟!

من اگر میخواستم و بخوام سایت هم میتونم هک کنم، ولی تاحالا در این زمینه علاقه نداشتم و اون رو چندان سطح بالا و کاربردی ندیدم (یکی بخاطر اینکه از نظر اخلاقی و قانونی هم چندان مناسب نیست؛ دیگر شاید از نظر بازار کار و درآمد) و دنبالش نرفتم، ولی چیزی پیچیده تر و دشوارتر از چیزهایی که تاحالا یاد گرفتم نیست که فکر کنم نمیتونم. صرفا علاقه و وقت و اولویتش رو نداشتم و ندارم. همین. بخوام هم برم دنبالش طبیعتا باید مدتی روش کار و مطالعه کنم تا بتونم خوب یاد بگیرم و مسلط بشم به تمام جوانب و ابزارهاش (با اینکه پیشاپیش و از نظر پایه خیلی قوی هستم ولی بهرحال مدتی تجربه و یادگیری در هرچیزی که تازه وارد میدان عملش بشی لازمه).
همینطور یک کسی هم که فکر کرده دنیای امنیت همش همین هک و مک و دوتا برنامه و اسکریپت استفاده کردن و دوتا باگ و حفره و اکسپلویت پیدا و استفاده کردنه، و تمام یا بیشتر وقت و انرژیش رو روی این موارد صرف کرده باشه، خیلی چیزهای دیگری رو یاد نگرفته و توانایی انجام خیلی کارهایی رو نداره که نیاز به مسیر دیگر و یادگیری و تئوری خاص خودش داشته. مثل همین شاخهء رمزنگاری. واقعا هکرها چیز زیادی ازش میدونن؟ منکه تاحالا ندیدم اصلا! اکثرشون در این زمینه خیلی هم بی سواد بودن و بعضا اشتباهات و تصورات و نظرات غلطشون رو دیدم. اینا شاید بتونن گهگاه بعضی موارد و سایتهایی رو هک کنن، اما بی گمان متخصص درست و حسابی در علم رمزنگاری نیستن و حتی نمیتونن یک برنامهء نسبتا کوچک و ساده که واقعا امنیت علمی و اصولی در سطح بالا داشته باشه رو طراحی و پیاده سازی کنن. به سادگی بلد نیستن و توانش رو ندارن. اگر بخوان یاد بگیرن، باید مثل بنده برن و مطالب علمی و معتبر و سطح بالا و تئوری و آکادمیکش رو مطالعه کنن. اینم شاید چند سال زمان ببره. حداقل یک سال بطور فشرده و تمام وقت فکر میکنم وقت بخواد، اونم واسه آدمی که از نظر پایه قوی باشه (مسلما نه افرادی که از دوتا محاسبهء ریاضی و آماری سادش هم سردرنمیارن).

پیدا کردن سوراخ و اشتباهات دیگران، اونم سایتها و آدمهای کم و بیش معمولی و غیرمتخصص در بحث امنیت، یک کاره، و طراحی یک سیستم علمی و اصولی در سطح جهانی (بعضا در سطح سازمانهای امنیتی دنیا)، یه چیز دیگه.
کسی که هک میکنه چنین دانش و توانی رو نداره فقط به این خاطر که میتونه چندتا سایت رو هک کنه!
همینطور استدلال و درخواست شما از بنده هم لزوما ربطی به صحت دانش و صلاحیت بنده در این امور نداره.
اینا دو حیطه و دو طرف متفاوت هستن. هرچند با هم مشترکاتی هم دارن.
بهرحال آدم باید خیلی وقت و انرژی بذاره، سالها، که بتونه در هردوی این حیطه ها اطلاعات و تجربهء زیادی کسب کنه.
وقت و انرژی هرکس هم محدوده و برای خودش و هدف و علاقه و اولویت خودش ارزش بیشتری داره. من واقعا فکر نمیکنم مثلا یک متخصص علم رمزنگاری علاقهء زیادی به این داشته باشه که بره دنبال هک کردن سایت این و اون، گذشته از اینکه بهرحال اینم فوت و فن و زمان و تجربهء خودش رو میخواد. بعد شما انتظار داره به حرف هر بچه و کل کل بیاد بره کار و بار و نقش خودش رو ول کنه و بره دنبال یاد گرفتن و انجام هک و مک از اون نوعی که مد نظر شماست؟

----------


## eshpilen

خوبه شما به ما یاد دادی که امنیت همش یا بیشترش همین هک سایتهای ملته و  واسه همین کاره و فقط اینطوری میشه درش چیزی یاد گرفت و پخی شد!
اینو باید توی برنامهء درسی دانشگاههای آمریکا تذکر بدن و رشته های امنیتشون همین هک باشه و هکر بیرون بدن.
باید استادهاشون هم همین هکرها باشن و اونا بهشون نمره بدن و قبولشون کنن  :قهقهه: 
حالا الگوریتم ها و برنامه هایی که اینا بخوان درست کنن واقعا منو دیوونه میکنه که چه دنیایی شود  :تشویق: 
فکر  کن طرف که فقط هک و مک SQL Injection و متااکسپلویت و اینا رو بلده و  دوزار ریاضی و تئوری درست و حسابی سرش نمیشه، بخواد واسه دنیا الگوریتم و  برنامه و امنیت درست کنه! بخصوص برای کارهای جدی و امنیتی و نظامی و حکومتی  و مالی و این حرفا!

من واقعا نمیدونم به امثال شما باید چی گفت.  ولی تاحدی که میتونستم و اطلاعات داشتم سعی کردم مطلب رو روشن و باز کنم  براتون. چون میدونم که به احتمال زیاد حتی یک نفر هم توی این فروم پیدا  نمیشه که اندازهء بنده در این زمینه اطلاعات داشته باشه.
بهرحال خواه پند گیرید و خواه ملال، با خودتونه.
شما  میتونید سعی کنید از بنده چیزی یاد بگیرید، و میتونید هم با این مغلطه های  صدمن یک غاز و غیرمنطقی و غیرعلمی و چاله میدانی خودتون سعی کنید اثبات  کنید که بنده چیزی بلد نیستم و صلاحیتی ندارم و یا چیزهایی که میدونم  کاربرد عملی ندارن.
بنده در طی سالها خیلی سعی کردم که جنبه های  ناشناخته (بخصوص برای اکثر هموطنان عزیز) و علمی این رشته رو روشن و نشر  کنم تا ملت بفهمن که حقیقت چیه و چقدر وسعت و جنبهء علمی داره بیشتر مسائل و  حتی همین رشتهء ما چقدر از نظر علمی و نقش تئوری درش دست کم گرفته میشه  (شاید بخاطر اینکه هرکس با سواد سیکل و دیپلم هم میتونه بیاد توش و کارهایی  بکنه)، و ما چقدر نسبت به خیلی چیزها عقب و ناآگاه هستیم، و چه بحث ها و  منابع و افرادی در بقیهء دنیا وجود دارن و مطرح هستن. اینکه قدرت علم و  فناوری ای که از خارج میاد، یک بخش بزرگش بخاطر همینه. اصلا بدون اینها  شدنی نیست.
اما متاسفانه همیشه دیدم که سطح خیلی پایینه و میشه گفت حتی  یک نفر هم پیدا نمیشه که منظور بنده رو کامل و دقیق متوجه بشه و بتونه و  بخواد از مطالب و سرنخ هایی که بنده میدم استفادهء واقعی بکنه و سطح خودش و  جامعه و متخصصان کشور رو ارتقا بده.
البته این برای بنده به شخصه چندان  مهم نیست! من خودم علاقه داشتم و در درجهء اول بخاطر اهداف شخصی دنبال این  چیزها رفتم، وگرنه که میتونستم دنبال مسیر و چیزهایی برم که عموم و دیگران  میرن، و احتمالا اینطوری میتونستم بقدر کافی هم خودنمایی کنم و هم پول  دربیارم! اما هدف بنده نه خودنمایی بود و نه پول.
بهرحال بنده بعنوان  کسی که چیزی فهمیده و راهی رو رفته که کمتر کسی از افراد دور و برش رفتن  (فکر کنم دقیقا هیچکس!)، وظیفهء خودم دیدم این آگاهی و دانشها رو در جامعه  مطرح و نشر کنم. حالا اگر ظرفیت و خواهنده براش موجود نیست، من دیگه مقصر  نیستم و برام اهمیت چندانی هم نداره. من خودم باید میفهمیدم که بزرگترین  متخصصان و دانشمندان دنیا مثلا توی آمریکا چی میگن چطوری کار میکنن چی درست  میکنن چرا اینقدر قوی و موفق هستن. اینکه امنیت واقعی و اصولی در بالاترین  سطحش چیه و چطور بدست میاد. دوست داشتم هرچی که اونا میفهمن و میتونن منم  بفهمم و بتونم. هرچند احتمالا در کشور خودم کاربردی نداشته باشه یا اصلا در  طول زندگی خودم هم زیاد استفاده ای (حداقل از جنبهء مالی) ازش نکنم.
از  این جهت شما راست میگی که من زنبور بی عسل هستم، ولی این بخاطر بدون علم و  توان بودن بنده نیست، بلکه بخاطر اینکه که هدفم خودنمایی های سطح پایین  توده ها و یا پول نبوده. من برای این دو مقوله چیز مناسبی برای ارائه به  جامعه و افرادی مثل شما ندارم!

اما حداقل یک چیزی رو سعی کنید بدست  بیارید، چون بدون اون نمیتونید هیچوقت پیشرفت بهینه ای بکنید و به سطوح  واقعا بالاتری وارد بشید. اونم اینکه به دانش و دانشمند و خوره ها احترام  بذارید.
شما درنظر من بیشتر به یک عده نوجوان نادان و خام شبیه هستید تا چیز دیگر، چون گفتار و رفتار شما دقیقا همین رو نشون میده.
نوجوانان مغروری که چیز زیادی نمیدونن و به بزرگان و راه و اصول بنیادین علم و راستی احترامی رو که باید بذارن نمیذارن.
من همیشه سعی کردم این مسائل رو نشون بدم و اینکه چقدر اهمیت دارن و چقدر چیزهایی که ما داریم بخاطر اونهاست.
امثال  دانشمندانی که بیشتر افراد شاید هیچوقت حتی نامی ازشون هم نشنون، ولی این  افراد بودن که بخش اعظمی از پایهء علم و فناوری و خرد و امکانات امروز ما  رو ساختن، و همچنان هم همین افراد هستن که بخش اعظمی از اون رو به پیش  میبرن، و این کار بدون اونا ممکنه نیست! اما متاسفانه حتی کسانی که مثلا  دانشگاه رفته و متخصص و مدعی رشته های تخصصی هستن، در این زمینه اکثرا  اطلاعات و درک و بینش کافی ندارن. امثال مکانهای عمومی اینترنت و این فروم  ها که بماند! بعضی وقتا احساس حماقت میکنم از اینکه میام جایی و چیزهایی  میگم و مطالبی میذارم و وقت و انرژی خودم رو اونجا صرف میکنم، که انگار  سطحش خیلی پایین تر از این حرفاست که کسی از حضار در اونجا از حرفها و تلاش  من چیزهایی رو که میخوام بگم بفهمه و بتونه استفاده ای ازشون بکنه. بنوعی  انگار دارم تلاش میکنم که سطح توده ها رو به نخبه ها برسونم، یا حداقل در  زمینهء آگاهی اولیه و باز کردن راه در این زمینه کاری بکنم.
انگار توده ها همیشه توده خواهند ماند. بله این یک واقعیت است. هرچند من در این توده ها به دنبال نخبه ها میگردم.
توده  ها هیچوقت نمیتوانند نخبه شوند، اما من فکر میکنم شاید حداقل میتوان آنها  را نسبت به جایگاه شان و علت واقعی جایگاه و ضعف هایشان آگاه کرد تا  عاقلانه تر فکر و رفتار کنند. یعنی کمی آنها را با خرد آشنا کنم!
ما  باید بفهمیم که این فقط هکرها و سطح و فعالیت های آنها نیست که دنیا را به  پیش میبرد و برای همگان مفید است، حتی در همین اینترنت و رایانه و برنامه  نویسی که هجمهء آنها همه جا را پر کرده است! هرچند هکرها هم نقش خودشان را  در تمامی دنیا دارند!
یکسری چیزها بود و هست که در کشور ما تقریبا بطور  کامل ناشناخته بود و هست. درواقع خیلی چیزها! ما در این زمینه منبع و مرجع و  افراد مطلع تقریبا نداشته و نداریم. حتی در یک موارد ساده و معروف در  دنیا.
من حالا باید چه کنم تا شما حرفهای مرا بفهمید؟ برم هکر بشوم و برایتان چند نمونه سایت هک کنم؟
مثل  اینکه از یک ریاضیدان یا فیزیکدان بخواهید که یک گاوصندوق را برایتان  بدون داشتن کلید و رمز باز کند تا ثابت شود که چقدر دانش و توان دارد و علم  و گفته هایش واقعا به دردی میخورد!
خب احتمالا آن ریاضیدان یا فیزیکدان  واقعا در این زمینه هم میتواند کارهایی بکند، تئوری و محاسبه و فرمولهایی  بدست بیاورد و ایده هایی بدهد، و شاید دست آخر هم موفق به انجام عملی اش  شود، اما فکر نمیکنم این یک شرط و معیار لازم برای پذیرفتن اعتبار آن دانشمند و اثبات  کاربردی بودن ریاضی یا فیزیک باشد! (شاید آن دانشمند واقعا زیاد عرضهء عمل را نداشته باشد، اما حداقل شما میتوانید خیلی چیزهای مفید برای خودتان را از آن متخصص یاد بگیرید و از او استفاده کنید بجای اینکه با او کل کل های بیهوده و غیرمنطقی کنید؛ چون بهرحال علم شما در آن زمینه دربرابر آن دانشمند خیلی کمتر است) بعدهم چنین افرادی مسیر خاص خود را رفته  اند و تخصص و کاربرد بهینه و مشغولیت هایشان در حیطهء تخصصی و تئوری یا  عملی مربوط به خودشان است؛ اینکه انتظار داشته باشیم با چنین درخواستهایی  براحتی موافقت کنند و اینقدر حوصله و وقت و آزادی عمل به خرج بدهند،  احتمالا در تمام موارد منطقی نیست! نه؟ افراد برجسته و نخبه در زمینه های  دیگر، معمولا وقتشان در نظر خودشان و برای جامعه ارزشمندتر از این است که  بخواهند وارد حیطه های کمتر مرتبط و سطح پایین تری بشوند، هرچند برای این  موارد استثنایی هم بوده و هست.
حرف این است که من بیایم سایت هک کنم که به شما چه چیز را چطور ثابت کنم آخر؟ و آیا این اثبات معتبری برای تمام ادعاها و نظرات بنده میشود؟
اگر  اینطور بود پس هکرهای بزرگ دنیا باید مرجع اول و کامل در زمینهء علم امنیت  و رمزنگاری هم میبودند و مثلا قویترین الگوریتمهای رمزگذاری و هش را آنها  اختراع کرده بودند و نه دانشمندان و متخصصان تئوریک و دانشگاه رفتهء این  رشته.

----------


## eshpilen

مثلا من میگم از bcrypt استفاده کنید (و البته بهتر از اون، scrypt)، نه الگوریتم خودساخته یا دیگری.
دلیل و منبعش رو هم که براتون آوردم. زحمت کشیدم سرچ کردم تحقیق کردم ترجمه کردم وقت گذاشتم از دانش و توان خودم براتون مایه گذاشتم.
حالا حرف حساب شما چیه مثلا؟
اینکه بیای کل کل کنی بگی راست میگی سایت هک کن؟!
بنظر بنده باید متشکر هم باشید و بجای این کل کل های بیهوده سعی کنید استفاده کنید.
حالا اگر سطحتون اینقدر پایینه که باوجود توضیحات و ترجمه های بنده و سرنخ ها و رفرنس هایی که میدم بازم نمیتونید متوجه بشید یا استفاده کنید، دیگه مشکل خودتونه. ربطی به توانایی سایت هک کردن و این حرفا هم نداره! من میگم علم و اصولش اینه، قویترین در دنیا اینه، به این دلیل به اون دلیل بر اساس فلان منابع و مراجع. حالا شما میخواید باز از خودتون همه چیز رو فکر و طراحی و پیاده سازی کنید خودتون میدونید، شاید هم هیچوقت به مشکل نخورید. ولی من دنبال چیزهای کامل ترین ها و قوی ترین های دنیا بوده و هستم، چون فکر میکنم حداقل یه وقتی ممکنه تا این سطح هم آدم نیاز و ضرورت داشته باشه.
اینکه شما چندتا سایت رو هک کردی دلیل بر این نمیشه که دانش و صلاحیت شما در زمینهء علم و اصول امنیت و رمزنگاری از من بیشتر باشه. وگرنه امثال شما دوتا از این الگوریتم ها رو درست کرده بودن تاحالا! منکه ندیدم تاحالا. همش کار دانشمندان و متخصصان برجسته و دانشگاه رفته این رشته است و بخش اعظمی از کارشون هم بر اساس تئوری و ریاضی و محاسبات و علم خاص خودشه. هرچند به احتمال زیاد افراد معمولی تر و هکرها هم در این زمینه کارها و کمک هایی کردن تاحالا. من منکر نقش و اهمیت هیچ حیطه و تخصصی در دنیا نیستم.

---------------------------------------------

ضمنا اینکه اینقدر این مسائل رو توضیح میدم و تاکید میکنم، چون اینا قواعد و  حقایق بنیادین در زمینهء منطق و خرد و علم امروز بشره. که انگار خیلی  افراد ازش بی اطلاع هستن!
بخاطر خودتون هم که شده مهمه که اینا رو یاد بگیرید و بفهمید.
عزیزم، حقایق دنیا به اون شکلی نیست که شما فکر میکنید!!
چه شکلی؟
خب  آدم حرفی که میزنه نحوهء منطق و استدلالش وقتی اینقدر مشکل داره و سطح  پایین و عوامانه است، اونم دربرابر بحثها و مسائل علمی و تخصصی و افرادی از  این دست، پس معلومه که چیزی از این موارد نمیدونه و تصور خامی از واقعیت  جهان و چیزها داره.
کلیت جهان رو بدون خرد و بینش علمی واقعی نمیشه به خوبی درک کرد.
وقتی با آدمی مثل بنده طرف میشید، جای این اشتباهات و حرفهای خام نیست!
اگر واقعا آدم قوی ای بودی، فقط مقاله های وبلاگ بنده رو که میخوندی و مطالب و تاپیک هایی که در اینجا داشتم، باید میفهمیدی که با چه کسی طرف هستی و در چه سطحیه.

----------


## سوداگر

شما هم اگه حرفی برای گفتن داشته باشید می شنویم  :متفکر:

----------


## eshpilen

ء د


> میخواستم ثابت کنم اندازه سر سوزن اطلاعات نداری فقط شبیه زنا پر حرفی 
> سبزی هم بلدی پاک کنی؟


امثال شما هم حرفی برای گفتن ندارید جز همین مغلطه ها و کل کل های چاله میدونی.
چون منطق و سواد درست و حسابی ندارید.
منم بقدر کافی تاحالا دانش و توانایی های خودم رو نشون دادم و اسنادش هم موجوده و برخلاف نظر شما خیلی های دیگه به سواد بنده رای دادن و صرحتا هم بیان کردن تاحالا (منجمله بعضی افراد از مدیران همین فروم). نیازی ندارم که یه بچه کم سواد و لجباز و نادان مثل تو منو ارزیابی و تایید کنه.
نهایتش تو یک هکر هستی مثل هزاران دیگر که به هک و مک سایت این و اون مشغولن و فکر میکنن همهء دنیا همینه، اما من یک دانشمندم با دانش و توانایی های خاص که خیلی مواردش بین هموطنان ما کم و بیش ناشناخته بوده (و بعضی موارد هنوزم هست)؛ فردی که نمونش خیلی کمه حداقل در کشور خودمون.
من دنبال هک نرفتم چون بنظر من فعالیت چندان سطح بالا و کاربردی و پایدار و سالمی نیست. مثل اینکه آدم بره دانش و مهارت قفل باز کردن و دزدی و این حرفا رو یاد بگیره و در این زمینه فعالیت کنه.
ولی از امنیت علمی و اصولی و رمزنگاری و روشهای جلوگیری اصولی اگر حرفی داری، من در این زمینه تخصص و اطلاعات خوبی دارم.
نیازی به اثبات خودم به شکل معکوس و در حیطهء دیگری ندارم. شما راست میگی نشون بده کدوم مطالب و روشها و کدها و برنامه هایی که بنده تاحالا ارائه دادم اشتباه یا پیش پا افتاده و کم ارزش بودن. البته با دلیل و سند درست و حسابی.

درمورد این هم که گفتم برنامه های 99% برنامه نویسان در اون حد نیست، زیاد قصد تمسخر نداشتم، بلکه جدی گفتم؛ و زیاد هم برنامه نویسان رو بخاطر این سرزنش نمیکنم، چون طراحی و پیاده سازی یک برنامهء نسبتا بزرگ و پیچیده که امنیت و اصولش بدون نقص باشه واقعا کار دشوار و هزینه بری هست (علاوه بر نیاز به سواد و دانش های خاص و پیشرفتهء خودش) و نیاز به تجربه هم داره و حتی خودم هم که در پروژهء سیستم رجیستر و لاگین تلاش کردم چنین سیستمی رو پیاده کنم واقعا دمار از روزگارم درآمد و تازه بنظرم هنوزم جای کار داره و بعضی مواردش کم و بیش ضعف داره؛ حالا بماند پارامترهای دیگری که هست مثل ساختار و مهندسی کد و ماجولار بودن و پرفورمنس و یوزرفرندلی و این حرفا که یه برنامه نویس باید همزمان اینا رو هم درنظر بگیره و پیاده سازی کنه.

----------


## masiha68

> میخواستم ثابت کنم اندازه سر سوزن اطلاعات نداری فقط شبیه زنا پر حرفی 
> سبزی هم بلدی پاک کنی؟


دعوای مال من نیست ولی شناخت نسبی از دوستمونeshpilen  دارم 
 و شما هم اگه به وبلاشون سر بزنین کلی مطلب پیدا می کنین که پیدا کردنشون توی هر جایی محاله ... 
علم ایشون رو تایید می کنم و به نظرم اگه اقای شهرکی نبود مدیریت تالار رو به ایشون میدادن .

کلا بهتره از اینکه اطلاعات و علممون رو به رخ هم بکشیم دوری کنیم و چون هیچکسی علامه نیست که همه چی رو بلد باشه یکی توی رمز نگاری استاده یکی هم توی دیزاین و یا رشته ی دیگه .
امیدوارم این بحث اینجا تموم شه .

----------


## home68

سلام
اول اینکه md5 و sha1  قابل هک شدن هستن ، کافیه تو گوگل سرچ کنید ، مثلا بنویسید:
online decoder md5
یا این سایت:
http://www.cmd5.org/
------------
شما از هش های ترکیبی استفاده کنید
درسته که md5 و sha1 قابل هک شدن هستن ، اما اگر از hash های تو در تو استفاده کنید ،  md5  هم هک کنن ، رمزنگاری شده ی hash دیگه رو بدست میارن
اما  بهتره که از این دو استفاده نکنید 
خود سایت php  کلی توابع برای hash گذاشته:
http://php.net/manual/en/function.hash.php

من که شخصا مثلا اینجوری استفاده می کنیم
اگر در حالت معمول یک hash بخوام استفاده کنم(که نمی کنم و تو در تو استفاده می کنم):
میشه:
hash("ripemd160","test")

حالا هش تو در تو: (که من از این مدل استفاده می کنم ، با انواع تابع هش ها که در http://php.net/manual/en/function.hash.php  هست)
مثلا:
hash("ripemd160",hash("crc32b",hash("haval128,5",h  ash("sha512","test"))))

حالا همینو نمایش بدیم:
echo hash("ripemd160",hash("crc32b",hash("haval128,5",h  ash("sha512","test"))));
کلمه ی test رو ، اینجوری:
9a332dfb7f9a0c14a9d550e8d7fa2b62d386db44
----------
یا مثلا:
hash("sha256",hash("adler32",hash("haval160,3",has  h("crc32",hash("ripemd320","test")))))
نمایش:
echo hash("sha256",hash("adler32",hash("haval160,3",has  h("crc32",hash("ripemd320","test")))));
این عبارت:
1eb7aecf5e99b31475de43b17175678309190cb4b4414a3fc7  94a0dcb171288c
نمایش میده
در کل  کلمه ی test ، اول تبدیل به ripemd320 میشه ، نتیجه ی اون تبدیل به: crc32 میشه ، نتیجه ی اون تبدیل به haval160,3 میشه ، نتیجه ی اون تبدیل به adler32 میشه ، و نتیجه ی adler32 تبدیل به sha256 میشه  :لبخند گشاده!: 
حالا فرض کنید بجای sha256  از md5 استفاده کرده بودیم ، جی می شد؟ هیچی اگر هم md5 رمزگشایی کنن حاصل adler32  رو براشون نمایش میده  :لبخند گشاده!:  :کف کرده!: 
-------
در کل از هش های تو در تو استفاده کنید که خیلی بهتره ، ماشالله php بر خلاف دات نت ، خیلی توابع hash داره

----------


## masiha68

این تایپیک توی زمان خودش جواب داده شده و بهتر بود دوباره باز نمیشد ... 

ممنون از اطلاعاتی که در اختیار دیگران قرار دادید

----------


## sedamorde

سلام دوستان، امیدوارم خوب باشید.
اول ممنونم از همه کسانی که دانش خود را با دیگران تقسیم می‌کنند، بدون شَک کار پر ارزشی است.
دوم هم اینکه اگر زمان پاسخ به این تاپیک تمام شده و من دیر رسیدم یا موضوع تکراری بیان می‌کنم من را ببخشید.

قبل از اینکه در مورد امنییت صحبت کنیم باید بدانیم که امنییت یعنی چه؛ امنییت مجموع قدم‌هایی است که ما برای محافظت از اشخاص یا دارایی‌های خود، در برابر صدمات و آسیب‌ها بر می‌داریم.
در اینجا ما می‌خواهیم از رمز‌های عبور کاربران سایت خود محافظت کنیم. همانطور که فیلسوف بزرگ آلمانی گفته : به انداره‌ی آدم‌های روی زمین، راه حل برای انجام کارها وجود دارد و هیچ راهی بر راه دیگر تقدم نداره.

تا به حال گزارشی مبنی بر شکست شدن الگوریم‌های MD5 و SHA1 داده نشده. اما میدانیم که کتاب‌خانه‌های بسیاز بزرگی وجود دارد که میلیون‌ها رمز Hash شده را شامل می‌شوند و در کسری از زمان هکرها می‌توانند هزاران رمز را روی یک سیستم ورود امتحان کنند.
البته ما (همه‌ی ما برنامه نویسان) می‌دانیم که نباید اجازه دهیم کاربر بتواند مثلاً بیش از 5 بار برای ورود با یک Username مشخص رمز وارد کند. خوب اینطوری امکان استفاده از کتاب‌خانه‌های آماده هم کم می‌شود.
اما گر به هر دلیلی هکرها به پایگاه داده‌ی ما دسترسی پیدا کردند چی!؟ اینجاست که الگوریتم‌های رمز نگاری به کمک ما می‌آیند.

حتماً می‌دانید یکی از فلسفه‌های یونیکس (Unix) و سیستم عامل‌های شبه یونیکس (مثل Linux) سخت‌تر کردن کارها برای محافظت بیشتره. حرف لینوکس شد بد نیست اضافه کنم که؛ هسته‌ی لینوکس به صورت پیش فرض از MD5 برای ذخیره سازی رمزها در /etc/shadow استفاده می‌کنه و البته از الگوریتم‌های زیر هم پشتیبانی می‌کنه :


MD5
blowfish
eksblowfish
SHA-256
SHA-512


سیستم عامل Ubuntu از نسخه‌ی 12.04 به بعد از SHA-512 استفاده می‌کنه (فکر کنم CentOS هم همینطور). تا جایی هم که من اطلاع دارم گوگل هم از یک الگوریتم پیچیده بر اساس زمان استفاده می‌کنه.

تا اینجا امیدوارم متوجه شده باشید که هیچ کدام از الگوریتم‌های ذکر شده شکسته نشدند. اما برخی از آنها منسوخ شده.

اما من به عنوان یک برنامه نویس PHP نمی‌تونم از خیره استفاده از MD5 بگذرم،‌ چرا؟ سرعت فوق العاده‌ای داره و خیلی ساده‌ کار می‌کنه. ولی بر اساس فلسفه یونیکس کمی سخت‌ترش می‌کنم


hash('md5', '123456');// result = e10adc3949ba59abbe56e057f20f883e
hash_hmac('md5', '123456', 'my_salt');// result = 9e3f96127058d20980ecd1fb304208cd



خوب معلوم که کد دوم کار را برای هکر‌ها سختر می‌کنه،‌ پس بهتره چون ما با استفاده از یک سری کاراکتر اضافی ، تغییری در الگوریتم ایجاد می‌کنیم. اگر my_salt‌ را تغییر دهیم نتیجه هم تغییر می‌کند. به این ‌می‌گویند Salt.
همیشه‌ استفاده از Salt در هر الگوریتمی بهتر از اسفاده نکردنه بخصوص برای جلوگیری از حملات Rainbow table (در ادامه بیشتر توضیح میدم).

البته استفاده از MD5 و SHA1 برای رمزهای عبور پیشنهاد نمیشه (من ده‌ها مقاله خواندم و همه به دلیل منسوخ شدن نه شکسته شدن، استفاده از این الگوریتم‌ها را پیشنهاد نکرده‌اند)

در مورد الگوریتم‌های SHA هم باید عرض کنم که SHA1 از سال 2001 عرضه شد و تا سال 2005 مورد استفاده وسیع قرار می‌گرفت، اما خطاهایی در الگوریتم ریاضی آن پیدا شد که احتمال شکسته شدن آن را میداد (گرچه هنوز شکسته نشده).
برای همین سال 2005 آژانس امنیت ملی آمریکا SHA2 را منتشر کرد که شامل الگوریتمی‌های 256 و 512 بایتی بود.
تا جایی که من اطلاع دارم SHA-512 در سیستم‌های 64بیتی ، سریع‌تر از SHA-256 کار می‌کنه (نیاز به منبع و آزمایش دارد) 

یکی از توابع خویی که در PHP می‌توانید استفاده کنید Crypt است. Crypt یک Utility Software (برنامه‌ کمکی) جهت رمز نگاری است که برای Unix طراحی شده، باید ذکر کنم این برنامه جهت بهبود الگوریتمی که توسط استاد دنیس ریچی (خالق زبان C و سیستم عامل Unix) نوشته شده بود ساخته شد، روحش شاد.


الگوریتم قدرتمند دیگر Blowfish است که با Crypt ادقام می‌شود. Blowfish سال 1993 ساخته شده و تا امروز هیچ انسان و نرم افزاری قادر به شناسایی و شکست آن نشده.
مثالی میزنم اما روش‌های بهتر و بیشتر را در گوگل پیدا کنید.




/**

 * Password Hash

 *

 * @param  string

 * @return string

*/

function pass_hash($input){

    $salt = '';

    $salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,10));

    for($i=0; $i < 22; $i++)

    {

        $salt .= $salt_chars[array_rand($salt_chars)];

    }


    return crypt($input, sprintf('$2a$%02d$', 8) . $salt);

}


/**

 * Password Check

 *

 * @param  string

 * @param  string

 * @return bool true on success/false on failure

*/

function pass_check($pass_entered, $saved_hash_pass){

    if(crypt($pass_entered, $saved_hash_pass) == $saved_hash_pass){

        return true;

    }else{

        return false;

    }

}


$saved_hash_password = pass_hash('123456');


$check = pass_check('123456', $saved_hash_password);

if(true == $check){

    echo $saved_hash_password . '<br>';

}else{

    echo 'Invalid password';

}




توضیح الگوهای دیگر خارج از حوصله من و شماست اما می‌توانید در مورد آنها هم تحقیق کنید.

و اما نکات مهم درباره‌ی SALT:

در بالا برای دوستان تازه کار Salt را توضیخ دادم. در حملات Rainbow Table الگوریتم‌های ضعیف به راحتی شکسته می‌شوند. برای همین Salt (رشته‌ی تصادفی که ما ایجاد می‌کنیم) مقاومت در برابر این حمله‌ها را بیشتر می‌کند.
شاید شما هم (مثل من در گذشته) از رشته‌ای مانند زیر برای Salt استفاده می‌کنید : 


$L+/F%5F:!QFpwu)



WPA2 که برای بیشتر مودم‌ها استفاده می‌شود از کاراکترهایی مانند !@#$ و ... استفاده می‌کند. بیشتر نرم‌افزارهای شکستن رمز عبور مودم‌ها نمی‌توانند این کاراکترها را پیدا کنند، حتی اگر بتوانند ار الگوریتم‌های موجود برای پیدا کردن رمز بهینه استفاده کنند، پیدا کردن هر کاراکتر حداقل 6 ماه وقت لازم دارد. پس به نظر نمی‌آید کسی بتواند به این سادگی‌ها رشته‌ی فوق را حدس بزند، البته که منظور من اساتید و دانشجویان رشته‌ی رمز نگاری در دانشگاه هاروارد نیست!

ولی می‌توانیم خیلی ساده راه را حتی برای رمز شناسان سخت‌تر کنیم. برای این کار از توابع OpenSSL استفاده می‌کنیم.



if(function_exists('openssl_random_pseudo_bytes'))

{

  $my_salt = openssl_random_pseudo_bytes($length = 20, $strong);

  if(true === $strong){

  return $my_salt;

  }

}




تابع فوق یک رشته‌ی 20 کاراکتری، غیر قایل حدس زدن ایجاد می‌کند (نتیجه خروجی قابل چاپ نیست، امتحان کنید و ببینید). البته باید اضافه کنم که این تابع سرعت زیادی ندارد و خوب قرار هم نیست در لحظه ده‌ها بار استفاده شود.
ترکیب Salt شما با نتیجه‌ی کد فوق ‌میتواند Salt بسیار قوی‌ای ایجاد کند.

اما یک نکته! می‌خواهیم برای تمام کاربران سایت از یک Salt استفاده کنیم!؟ خوب اگر Salt ما به هر دلیل شکسته شد تمام رمزها به خطر می‌‌افتد!!!
شاید بهتر باشد برای هر کاربر یک Salt اختصاصی تولید کنیم و در پایگاه داده ذخیره کنیم. خوب این کار خوبی است اما پایگاه داده ما را سنگین‌تر می‌کند، برای همین باید تمام جوانب را در نظر بگیریم.
از طرفی ما Salt ها را در پایگاه داده ذخیره می‌کنیم و فرض کردیم پایگاه ما به دست هکرها افتاده است... پس باز هم رمزها را از دست می‌دهیم!

برای حل این مشکل باید از الگو‌های Encryption‌ و Decryption برای نگه‌داری Salt ها استفاده کنیم (پیشنهاد می‌کنم در این مورد بیشتر تحقیق کنید).

یا حتی ار یک Salt از قبل ساخته شده که فقط در فایل سیستم نرم افزار ما موجود است، استفاده کنیم و آن  را با Salt کاربر ترکیب کنیم، هکرها معمولاً نمی‌توانند در یک لحظه هم به فایل سیستم هم به پایگاه داده دسترسی پیدا کنند، اگر هم دسترسی پیدا کردند که اصلاً توابع ما فرقی نداره چی باشه ;)


در انتها باز تکرار می‌کنم؛ به اندازه آدم‌های روی زمین راه برای انجام کارها وجود داره. از هوشی که همه‌ی ما انسانها در اختیار داریم استفاده کنید.
امیدوارم دانسته‌های من به شما کمک کنه و سایت‌های مطمئنی بسازید.
موفق باشید.

----------

