انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: Ma3X در 03 خرداد 1393، 11:47 قظ
-
بدون مقدمه میرم سر اصل مطلب. دیروز این ایده به ذهنم رسید:
<?php
// generate random number and password md5s
$random = md5(rand());
$password = md5("Secret");
// make an index. then, suffle and slice that
$index = range(0, 63);
shuffle($index);
$pattern = array_slice($index, 0, 32);
sort($pattern);
// finally create the VARCHAR(64) that contains the password and random number md5s
$final = array();
$j = 0;
$k = 0;
for ($i = 0; $i < 64; $i++) {
if (in_array($i, $pattern)) {
$final[] = $password[$j];
$j++;
} else {
$final[] = $random[$k];
$k++;
}
}
// (USE FOR TEST ONLY) print result, random number md5 and password md5
foreach($final as $result) {
echo $result;
}
echo "<hr>";
$rand_md5 = array();
$pw_md5 = array();
for ($i = 0; $i < 64; $i++) {
if (in_array($i, $pattern)) {
$pw_md5[] = $final[$i];
} else {
$rand_md5[] = $final[$i];
}
}
echo "pattern: ";
foreach ($pattern as $tmp) {
echo "{$tmp}, ";
}
echo "<br>password: ";
foreach($pw_md5 as $pm) {
echo $pm;
}
echo "<br>random: ";
foreach($rand_md5 as $rm) {
echo $rm;
}
?>
اینم یک خروجی تست:
01e856499b247ac70e1bfb3ef9a952908a1dc97a9a26f35eb9692b0c4cc87cc5
pattern: 1, 2, 5, 7, 11, 12, 13, 14, 15, 20, 21, 22, 26, 27, 28, 29, 30, 33, 37, 38, 42, 43, 47, 48, 50, 51, 52, 57, 59, 61, 62, 63,
password: 1e6947ac7fb3a9529a9726eb692c8cc5
random: 08549b20e1bef9081dca9af359b0c4c7
چیزی که توی دیتابیس ذخیره میشه اون رشته ۶۴ حرفی هست که ۳۲ حرف اون مربوط به md5 گذرواژه هست. الگو برای هر بار نصب متفاوته و فقط ما میدونیم الگو چیه، پس کسی که این رشته رو میدزده عملا هیچ استفادهای ازش نمیتونه ببره.
دوستانی که این مطلب رو خوندن اولا نظرشون رو راجع به این تکنیک بگن و ثانیا بگن در عمل چه مزایا و معایبی داره و ثالثا این روش در مقایسه با salt یا دیگر تکنیکهای موجود، قویتر یا ضعیفتر هستش؟!
با تشکر
-
در رمزنگاری، همیشه فرض بر این هست که روش شما رو میتونن ببینند، چون کسی که دسترسی به سرور پیدا کنه، روش شما رو میبینه. حالا اگر روش جدیدی دارید، باید با ریاضی اثبات کنید که این روش قویتر هستش و این روشها رو در کتابهای آکادمیک برای Cryptography میتونید یاد بگیرید.
اینکه بگیم دهبار MD5 بگیریم و روش امنی داریم، یا روشهای ابتکاری از ترکیب اینها بدست بیاریم، از لحاظ آکادمیک فقط شوخی حساب میشن.
در حال حاضر، بهترین روش غیر بازگشتی و کاربردی، استفاده از یک Salt به صورت تصادفی و الگوریتمی مثل SHA1 هستش. این روش به اندازه کافی امن هست و نیاز نیست بیش از این روی اون وقت بذارید، غیر از اینکه بخواید به صورت آکادمیک و به زبان ریاضی یک روش امنتر پیدا کنید.
اگر دوست دارید واقعا توی این زمینه کار بکنید، اولین پیشنیاز کارتون شناخت Hashها هست و برای شروع میتونم این Paper رو بهتون پیشنهاد بکنم: لینک (http://www.inf.usi.ch/faculty/shrimpton/spring09/damgard89.pdf) (از سال ۱۹۸۹)
بعد از اون میتونید در مورد روشهای عمومی رمزنگاری مطالعه کنید و این کتاب پیشنهاد من هستش: لینک (http://www.cs.bris.ac.uk/~nigel/Crypto_Book/)
-
خیلی ممنونم، توضیحات کاملی ارائه دادین و مثل اکثر اوقات با خوندن پست شما یک چیز جدید یاد گرفتم (:
در مورد بحث علاقه و cryptography؛ علاقه دارم ولی خب علایق مهمتری دارم و چون عمر ما محدود هست نمیتونم به همه این علایق برسم... این دست ایدهها زیاد به ذهن من میرسن (کلا ذهن بازیگوشی دارم) و بعضی از این ایدهها برام بسیار شگفتانگیزن (مثلا یک روش باینری برای فشردهسازی اطلاعات توی ذهنم دارم)، به بعضیشون پر و بال میدم و بعضی دیگه رو مطرح میکنم و یه سری دیگه رو هم رها میکنم...
باز هم ممنون (: