به نظر من برای بالاتر بردن امنیت این کار الزامی است. چرا که در صورت نفوذ به db هم نفوذگر را کاملا سردرگم خواهد کرد و امکان پیدا کردن اینکه چه username ی دارای چه مقدار hashشده ای برای password اش است، بسیار کم می کند.آیا لزوما" احتیاجی به Hash کردن "نام کاربری" نیز هست؟
خوب از این نظر نیز مشکلی نخواهد بود چرا که اصلا اجباری نیست تا مقدار واقعی username رو دوباره از db خوانده و آنرا نمایش داد (در طول برنامه) --البته این کار امکان پذیر نیز نحواهد بود به دلیل hashing.همچنین معمولا" هنگامیکه برنامه در حال اجراست در قسمتی از آن نام کاربری درج میشود - به صورت Plain-Text -
برای این کار پس از اعتبار سنجی اطلاعات login در صورت صحت اطلاعات ورودی، مقدار plain text مربوط به username که در زمان login وارد شده خوانده شده و به عنوان username آن کاربر در طول برنامه نشان داده می شود.
این امر چه تاثیری بر روند کار می تواند داشته باشد؟ فرض کنیم که فردی بتواند به درستی نام کاربری را حدس بزند، اما در صورتیکه کلمه عبور را اشتباه وارد کند نمی تواند بفهمد که نام کاربری اش درست بوده.حدس زدن یا به هر حال بدست آوردن نام کاربری زیاد دشوار نخواهد بود
موافقمآیا بهتر نیست روش Attach کردن Salt به پسورد را تغییر دهیم؟ بدینصورت که به جای اینکه Salt را مستقیما" به انتهای پسورد اضافه کنیم ، آن را با یک روش مشخص در طول پسورد پخش (Distribute) کنیم،
اما در اینصورت ما یک salt داریم و در صورت لو رفتن آن (به هر نحوی) هم username رو از دست داده ایم و هم password را (یعنی امکان این امر افزایش پیدا میکنه).روش Salted-Hash عموما" بدین صورت است که ابتدا مقدار مورد نظر(پسورد ، نام کاربری ...) با Salt (که میتواند جهت امنیت بیشتر به طور رندوم تولید شود) ترکیب شده و مقدار بدست آمده از ترکیب این دو ، Hash میشود ، حال ما میتوانیم برای اینکه به قول شما Salt تا میزانی از دید پنهان بماند ، آن را به انتهای این مقدار Hash شده ی به دست آمده اضافه نماییم ،
اگر هر کدام را جداگانه hash کنیم در اینصورت salt های متفاوتی خواهیم داشت و امکان این که هر دو salt لو بروند کمتر خواهد بود. در پایان میتوان برای نگهداری مقادیر hash شده username و password را با هم ترکیب کرد (با الگوریتم های مناسب) و سپس در db نگهداری کرد.
به نظر من بهتر است این بحث را به آینده موکول نمایید تا مسیر بحث منحرف نشود زیرا این مسئله جزو پیاده سازی محسوب می شود . (البته این فقط پیشنهاد است)روش پیشنهادی شما برای محافظت از آین قسمت خاص از کد چیست؟