PDA

View Full Version : حرفه ای: هش حرفه ای بدون رندوم



alinwp
جمعه 07 فروردین 1394, 11:26 صبح
سلام
من یه تابع هش نوشتم که برای هر ورودی یک هش میده یعنی رندوم نمیندازه هر سری یه چیز بده بع من کدشو میزارم اگر شد خوشحال میشم دوستان این هشو بشکونن یعنی ضد اینو بنویسن بعدش این تنها 2 میکرو ثانیه از لحاظ سرعت با md5 فرق داره و مصرف مموریش 9408 واحد بیشتر از md5 هست

یه چیزو اضافه کنم (جنبه اینکه خودم ساختم نمیگم) اینو برای رمزای یه اسکریپت بهتر از md5 میدونم چون یه رمز حداکثر 12 کاراکتر حد معمول اونوقت md5 میاد اینو 32 کاراکتر میکنه که اگر یوزر های یه سیستم بالا باشه حجم دیتابیس بیشتر میشه


<?php
$time1 = microtime(true);
function zhash($input){
$output = "";
$last = ord($input[strlen($input)-1]);
$first = ord($input[0]);
$code = round(sqrt($last * ($first + $last-5)/10), 0);
$b_out= 542;
for($i = 0;$i <= strlen($input)-1;$i++){
$p = ord($input[$i]);
$code += $p * 3;
$next = (isset($input[$i+1])) ? ord($input[$i+1]) : ((isset($input[$i-1])) ? ord($input[$i-1]) : $p);
$prev = (isset($input[$i-1])) ? ord($input[$i-1]) : $next;
if($code < 50){
$out = chr($p * ($next+$prev+$i));
}elseif($code < 200){
$out = chr($next * ($p+$prev-3));
}elseif($code < 300){
$out = chr($next * ($p+$prev-3));
}elseif($code < 400){
$out = chr(2 * ($code+$prev+$next*$i-$next));
}elseif($code < 500){
$out = chr(round(sqrt($code+$prev+$next-$next), 0));
}elseif($code < 600){
$out = chr(round($next * ($p+$prev-3), 0));
}elseif($code < 700){
$out = chr(round($code * ($p+$last-3), 0));
}elseif($code < 800){
$out = chr(sqrt($b_out) * ($first+$code-3));
}elseif($code < 900){
$out = chr(sqrt(sqrt($first+$i)) * ($p+$code-3));
}elseif($code < 1000) {
$out = chr(sqrt(sqrt($first)) * ($p+$b_out-3));
}elseif($code >= 1000){
$out = chr($b_out * ($p+$prev-3));
}
$b_out = ord($out);
$output.= chr($b_out*2);
}
return str_replace(" ","",$output);
}
$input = (isset($_GET['q'])) ? $_GET['q'] : "Ali";
echo zhash($input);
$time2 = microtime(true);
echo '<br><b>Total Execution Time:</b> '.($time2-$time1).'<br> Memory usage:'.memory_get_usage();
اینم اضافه کنم مثلا این نیست که برای حرف A تو تمام ورودی ها یک چیز جایگزین کنه
به بزرگی و کوچکی حروف حساس است

freeman99
جمعه 07 فروردین 1394, 12:49 عصر
من یه تابع هش نوشتم که برای هر ورودی یک هش میده یعنی رندوم نمیندازه هر سری یه چیز بده
خروجی md5 هم رندوم نیست. به اصطلاح میگن یک تابع deterministic است. یعنی ورودیش رو بدونی میتونی خروجیش رو دقیقا محاسبه کنی (نه اینکه برای دو نفر دوتا چیز متفاوت دربیاد).


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

ضمنا md5 چیه که رفتی جایگزین هم براش درست کردی؟ :لبخند:
md5 سالهاست شکسته شده و ناامن بحساب میاد و از استانداردهای رسمی خارج شده. ضمنا برای کاربردی مثل هش پسورد هم خیلی پیش از اون به دلایل دیگر مناسب نبود.
برای هش کردن پسورد الگوریتم های مخصوص و خفن تری هست مثل bcrypt که خواص افزوده ای دارن که در کاربرد هش پسورد اهمیت دارن.

php_programmer021
جمعه 07 فروردین 1394, 13:44 عصر
با سلام
در خصوص اینکه فرمودید MD5 شکسته شده می خواستم خدمت شما عرض کنم این هش به هیچ عنوان شکسته نشده است و اگر شما مشاهده می کنید که بعضی از وب سایت هش ساخته شده با MD5 رو از شما می گیرند و کلید اصلی را بر می گردانند دلیل بر شکسته شدن این هش نیست، بلکه آنها با استفاده از پایگاه داده هش ساخته شده با MD5 را به همراه کلیدی که تولید شده رو نگه داری می کنند و وقتی شما هش مورد نظرتان را در آن سایت وارد می کنید در واقع یک حالت جستجو انجام می شود اگر هش شما به همراه کلید وجود داشته باشد خروجی را به شما بر می گرداند و در غیر اینصورت خیر.
البته این موضوع به دلیل اینکه پایگاه های داده استفاده شده درحال حاضر حاوی هش های بسیار زیادی هستند برای کاربران این تفکر را که MD5 شکسته شده است را ایجاد می کند.
با تشکر

freeman99
جمعه 07 فروردین 1394, 14:33 عصر
دوست عزیز این چیزا که میگی من از سالها پیش بارها خوندم دربارش هم بحث کردم.
بحث شکسته شدن md5 مربوط به این قضیه نمیشه و الگوریتم های هش کاربردها و خصیصه های متعددی دارن که حتی اگر یکی از این خصیصه ها شکسته بشه در نتیجه تعداد زیادی از کاربردهاش (نه همهء کاربردهاش) ناامن میشن و میگن اون الگوریتم شکسته شده.
درمورد md5 در درجهء اول خصیصهء collision resistance هست که شکسته شده، و این به کاربرد هش پسورد شاید ربط مستقیمی نداشته باشه، ولی بهرحال میگیم که md5 شکسته شده! یه سرچ بزنید تحقیق و جستجو کنید در کلی منابع هم به صراحت به این مسائل و شکسته شدن md5 اشاره شده، اگر خودتون نتونستید پیدا کنید و بخونید یا به هر دلیلی قانع نشدید بگید براتون منبع و ترجمه بذارم.
بعدم الگوریتمی که یکی از خصیصه های اون شکسته بشه معمولا ریسک شکسته شدن در وادی های دیگر هم بالا میره و استفاده با اون در کاربردهای دیگر هم با شک و تردید مواجه میشه و مسائل جانبی دیگر، بنابراین توصیه نمیشه و خیلی وقتا هم از استانداردها حذف میشه.
گذشته از تمام اینا، حتی قبل از تمام این ماجراهای شکسته شدن، حتی بدون وجود این پایگاههای داده و rainbow table ها برای md5، استفاده از md5 برای هش پسورد راه حرفه ای و اصولی و امنی محسوب نمیشد، چون md5 رو میشه با سرعت بسیار بالایی اجرا کرد و در نتیجه میشه میلیاردها ترکیب پسورد رو در زمان کوتاهی تست کرد که به این شکل بخش بزرگی از پسوردهایی که کاربران استفاده میکنن براحتی قابل تست و مقایسه با هش موجود هست و این یعنی کرک شدن کامل، نیازی به پایگاه داده و چیز دیگه هم نداره؛ اونایی که این کاره ان میدونن چیه و میتونن انجامش بدن. الگوریتم هایی مثل bcrypt که مخصوص کاربرد هش پسورد طراحی شدن عمدا سنگین و کد هستن و از نظر الگوریتم داخلی طوری طراحی شدن تا کرکرها نتونن براحتی پسوردهای خیلی زیادی رو در زمان کوتاهی تست کنن و همچنین نتونن از ده ها برابر سرعت بالاتر کارت گرافیک که برای کرک الگوریتم های هش استاندارد مثل md5 استفاده میشه بهره ببرن.
هش کردن پسورد با انواع هش های دیگری که روی نوع داده های دیگری در زمینه های مختلف کاربرد دارن تفاوت میکنه از نظر مسائل درگیر و ضعف هایی که داره و نیازهایی که هست.