همانطور که می دانید پسوردها در لینوکس در فایل /etc/shadow ذخیره می شوند.
الگوریتمی که لینوکس به طور پیش فرض استفاده می کند MD5 (Message-Digest algorithm 5) است. برای چک کردن این مطلب دستور زیر را می زنیم :
$ cat /etc/login.defs | grep ENCRYPT_METHOD
ENCRYPT_METHOD MD5
همچنین از مقدار $1$ در اول پسورد hash شده این قضیه معلوم می شود :
# grep vahid /etc/shadow
vahid:$1$MMeXr9/v$vGA2B5YeLI1dUObfbaCbf/:15675:0:99999:7:::
لینوکس به جای این که مستقیما MD5 Hash مربوط به پسورد کاربر را در فایل /etc/shadow قرار دهد آن را با یک مقدار به نام salt که یک مقدار random است ترکیب می کند و ترکیب این دو را در فایل /etc/shadow قرار می دهد و برای همین است که دو کاربر که پسورد یکسان دارند با این که MD5 Hash پسوردهای آنها با هم یکی می شود ولی مقادیر متفاوتی را در فایل /etc/shadow می بینیم. می توان برای درک بهتر روش محاسبه آن را به صورت زیر در نظر گرفت (در عمل روش محاسبه پیچیده تر است)
hash = md5($salt.$password)
این کار برای جلوگیری از حمله های brute-forceاستفاده می شود این حمله ها از Rainbow tableها استفاده می کنند که میتوان آنها را یک dictionary بزرگ از مقادیر hash های از پیش حساب شده و پسوردهای معادل این hash ها در نظر گرفت.
ترکیب یک پسورد با مقادیر تصادفی salt حدس زدن آن را برای این حمله مشکلتر می کند.
اگر دوباره به پسورد hash شده نگاه کنیم می بینیم که از چند قسمت تشکیل شده است که با علامت $ جدا شده است :
vahab:$1$MMeXr9/v$vGA2B5YeLI1dUObfbaCbf/:15675:0:99999:7:::
$1$ که نمایانگر الگوریتم MD5 است
8 کاراکتر بعدی تا قبل از علامت $ که مقدار تصادفی salt است.
22 کاراکتر آخر که hash شده ترکیب پسورد کاربر و مقدار salt است.
پس زمانی که کاربر قصد ورود به سیستم را دارد ، سیستم پسورد کاربر را با salt مشخص شده آن کاربر در /etc/shadow ترکیب کرده و سپس مقدار MD5 آن را (پس از انجام یک سری محاسبات) با این 22 کاراکتر مقایسه می کند و در صورتی که با این مقدار برابر بود به کاربر اجازه ورود می دهد.
الگوریتمی که لینوکس به طور پیش فرض استفاده می کند MD5 (Message-Digest algorithm 5) است. برای چک کردن این مطلب دستور زیر را می زنیم :
$ cat /etc/login.defs | grep ENCRYPT_METHOD
ENCRYPT_METHOD MD5
همچنین از مقدار $1$ در اول پسورد hash شده این قضیه معلوم می شود :
# grep vahid /etc/shadow
vahid:$1$MMeXr9/v$vGA2B5YeLI1dUObfbaCbf/:15675:0:99999:7:::
لینوکس به جای این که مستقیما MD5 Hash مربوط به پسورد کاربر را در فایل /etc/shadow قرار دهد آن را با یک مقدار به نام salt که یک مقدار random است ترکیب می کند و ترکیب این دو را در فایل /etc/shadow قرار می دهد و برای همین است که دو کاربر که پسورد یکسان دارند با این که MD5 Hash پسوردهای آنها با هم یکی می شود ولی مقادیر متفاوتی را در فایل /etc/shadow می بینیم. می توان برای درک بهتر روش محاسبه آن را به صورت زیر در نظر گرفت (در عمل روش محاسبه پیچیده تر است)
hash = md5($salt.$password)
این کار برای جلوگیری از حمله های brute-forceاستفاده می شود این حمله ها از Rainbow tableها استفاده می کنند که میتوان آنها را یک dictionary بزرگ از مقادیر hash های از پیش حساب شده و پسوردهای معادل این hash ها در نظر گرفت.
ترکیب یک پسورد با مقادیر تصادفی salt حدس زدن آن را برای این حمله مشکلتر می کند.
اگر دوباره به پسورد hash شده نگاه کنیم می بینیم که از چند قسمت تشکیل شده است که با علامت $ جدا شده است :
vahab:$1$MMeXr9/v$vGA2B5YeLI1dUObfbaCbf/:15675:0:99999:7:::
$1$ که نمایانگر الگوریتم MD5 است
8 کاراکتر بعدی تا قبل از علامت $ که مقدار تصادفی salt است.
22 کاراکتر آخر که hash شده ترکیب پسورد کاربر و مقدار salt است.
پس زمانی که کاربر قصد ورود به سیستم را دارد ، سیستم پسورد کاربر را با salt مشخص شده آن کاربر در /etc/shadow ترکیب کرده و سپس مقدار MD5 آن را (پس از انجام یک سری محاسبات) با این 22 کاراکتر مقایسه می کند و در صورتی که با این مقدار برابر بود به کاربر اجازه ورود می دهد.