PDA

View Full Version : salted hash



Vahid_Nasiri
جمعه 06 آذر 1383, 11:56 صبح
salted hash


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

حالت معمولی و بدون رمزگذاری (امنیتی ندارد)
رمزگذاری کردن پسورد (یک ستاره)
هش کردن پسورد (دو ستاره)
استفاده از salt (سه ستاره)


Salted Hash چیست؟

یکی از حملاتی که در مورد پسوردهای هش شده در دیتابیس ممکن است صورت گیرد استفاده از مجموعه ای از کلمات هش به صورت یک دیکشنری آماده و مقایسه آنها با موارد موجود است (Dictionary Attack) . برای اینکه اینگونه حملات در عمل بی اثر شوند (زمان بسیار بیشتری را نیاز داشته باشند) ، اضافه کردن رشته ای اتفاقی به هر پسورد وارد شده (به آن salt نیز می گویند) و سپس هش کردن کل مجموعه ی مقدار اتفاقی و پسورد، می تواند صورت گیرد.

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


username, char(30), primary key
salt, char(10)
password_hash, char(40)

و مثالی از داده های ذخیره شده پس از اعمال این روش :


Username=Jsmith
Salt=BXZLUOZXAC
password_hash=89A4C867DE091B91BDD8097B4B32E10A1368 96C3



اعتبار سنجی کاربران در لحظه ورود به سایت:

در این حالت الگوریتم کار به صورت زیر خواهد بود:
· در دیتابیس ، نام کاربر وارد شده جستجو شده و در صورت یافت شدن ، مقادیر salt و password_hash دریافت می شود. در غیراینصورت پیغام 'کاربر یافت نشد' نمایش داده خواهد شد.
· پسوردی را که کاربر وارد کرده است با مقدار salt موجود در دیتابیس کنار هم قرار داده و سپس hash کل مجموعه حساب می شود.
· مقدار هش محاسبه شده در قسمت دو را با هش دریافت شده و موجود در دیتابیس (مربوط به قسمت 1) ، مقایسه می کنیم. اگر این دو مقدار با هم مساوی بودند کاربر مجاز به ورود می باشد


روشهای تولید salt و همچنین محاسبه هش:

اگر به موضوع این مقاله علاقمند شدید به مآخذ ذکر شده مراجعه نمایید ، نمونه الگوریتم های مربوطه را خواهید یافت.


مآخذ مورد استفاده:
http://www.15seconds.com/issue/000217.htm
http://msdn.microsoft.com/msdnmag/issues/03/08/SecurityBriefs
http://www.obviex.com/samples/EncryptionWithSalt.aspx
http://www.obviex.com/samples/Code.aspx?Source=HashCS&Title=Hashing%20Data&Lang=C%23
http://www.dotnetjunkies.com/tutorial/77D4AFDC-585D-4539-A364-30028327FF14.dcik

Vahid_Nasiri
یک شنبه 08 آذر 1383, 12:59 عصر
یک نمونه عملی:

نگارش های ورژن 2 به بعد فوروم IPB (قبل از آن فقط هش کردن ساده بود) .

برای مثال فوروم IPB 2.0.3 از کد زیر برای تولید salt استفاده می کند:


function generate_password_salt($len=5)
{
$salt = '';

srand( (double)microtime() * 1000000 );

for ( $i = 0; $i < $len; $i++ )
{
$num = rand(33, 126);

if ( $num == '92' )
{
$num = 93;
}

$salt .= chr( $num );
}

return $salt;
}

این اطلاعات در جدول ibf_members_converge ذخیره می شود:


CREATE TABLE `ibf_members_converge` (
`converge_id` int(10) NOT NULL auto_increment,
`converge_email` varchar(250) NOT NULL default '',
`converge_joined` int(10) NOT NULL default '0',
`converge_pass_hash` varchar(32) NOT NULL default '',
`converge_pass_salt` varchar(5) NOT NULL default '',
PRIMARY KEY (`converge_id`),
KEY `converge_email` (`converge_email`)
) TYPE=MyISAM;


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


function generate_compiled_passhash($salt, $md5_once_password)
{
return md5( md5( $salt ) . $md5_once_password );
}


هنگام ثبت نام:
پسورد دریافت می شود و سپس هش می شود. بعد بعنوان ورودی تابع فوق بعنوان md5_once_password دریافت می گردد. نمک کار (salt) با استفاده از تابع generate_password_salt تولید می شود. نهایتا generate_compiled_passhash در هنگام رجیستر کردن کاربران درون فیلد converge_pass_hash ذخیره می گردد.

هنگام لاگین:
Salt از فیلد converge_pass_salt خوانده می شود و بعد درون تابع مورد استفاده قرار می گیرد.
پسورد دریافت می شود و سپس هش می شود. بعد بعنوان ورودی تابع فوق بعنوان md5_once_password دریافت می گردد.
حاصل نهایی تابع باید با مقدار موجود در فیلد converge_pass_hash یکسان باشد.


Happy integrating

amirferdowsi
چهارشنبه 25 دی 1387, 00:20 صبح
سلام
دوستان کدی برای تولید Salt در C# دارید ؟

Naruto
چهارشنبه 25 دی 1387, 09:28 صبح
برای salt تو Net. میتونید به طور ساده از اعداد تصادفی استفاده کنید.
همچنین میتونید تو یه حلقه قسمتی از Hash را استفاده کنید.لازم نیست از اولین بایتش بخونید.هم برای Key و هم برای IV میتونید این کارو بکنید.
اینم خودش یه جور salt هست.:لبخند:
البته برای رمزنگاری باید به سایز کلید الگوریتمی که استفاده می کنید دقت کنید که سایز پسورد تولیدی شماکمتر از حداقل نباشه.

amirferdowsi
چهارشنبه 25 دی 1387, 16:27 عصر
برای salt تو Net. میتونید به طور ساده از اعداد تصادفی استفاده کنید.
همچنین میتونید تو یه حلقه قسمتی از Hash را استفاده کنید.لازم نیست از اولین بایتش بخونید.هم برای Key و هم برای IV میتونید این کارو بکنید.
اینم خودش یه جور salt هست.:لبخند:
البته برای رمزنگاری باید به سایز کلید الگوریتمی که استفاده می کنید دقت کنید که سایز پسورد تولیدی شماکمتر از حداقل نباشه.
سلام
میشه بیشتر توضیح بفرمائید .
اصلاً IV چی هست ؟

anubis_ir
چهارشنبه 25 دی 1387, 19:27 عصر
initialization vector
براي اطلاعات بيشتر به مستندات triple des و مانند آن رجوع كنيد.

amirferdowsi
چهارشنبه 25 دی 1387, 20:09 عصر
initialization vector
براي اطلاعات بيشتر به مستندات triple des و مانند آن رجوع كنيد.
سلام
میشه یک منبع فارسی معرفی کنید یا خودتون توضیح بفرمائید .

amirferdowsi
شنبه 28 دی 1387, 17:04 عصر
سلام
اینم یک کلاس برای تولید Salt در C#


using System;
using System.Text;
using System.Security.Cryptography;
namespace WebApplication1
{
public class Class1
{
private static readonly char[] Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz1234567890!@#$%^&*.?".ToCharArray();
public static string Salt()
{
StringBuilder str_Salt = new StringBuilder();
for (int i = 0; i < 9; i++)
{
str_Salt.Append(Letters[RandomNumber(Letters.Length)]);
}
return str_Salt.ToString();
}
private static int RandomNumber(int max)
{
RNGCryptoServiceProvider obj_RNG = new RNGCryptoServiceProvider();
byte[] byt_Random = new byte[4];
obj_RNG.GetBytes(byt_Random);
Int32 int_Number = BitConverter.ToInt32(byt_Random, 0) % max;
if (int_Number < 0)
{
int_Number = -int_Number;
}
return int_Number;
}
}
}

امیدوارم که مفید باشه.
خوشحال میشم که نظراتتون رو در این زمینه بیان بفرمایید