بدون مقدمه میرم سر اصل مطلب. دیروز این ایده به ذهنم رسید:
<?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 یا دیگر تکنیکهای موجود، قویتر یا ضعیفتر هستش؟!
با تشکر