
نوشته شده توسط
ali2000_1358
سلام دوستان من میخواستم بدونم چطور میشه یک کلمه عبور را اینکریپت کرده ودر زمانی که بخواهیم کلمه عبور رو مشاهده کنیم آنرا دوباره به حالت عادی نمایش بده به عنوان مثال کلمه عبور tr123 در بانک یک چیز دیگری ذخیره کنه ودر هنگامی که ما میخواهیم همان tr123 رو نمایش بده
سلام.
Encrypt کردن کلمات عبور کار مناسبی نیست، اگر چه بهتر از نگهداری اونها بصورت Clear هستش. اما واقعیت اینه که نه مدیر سیستم و نه کاربران، هرگر نیازی ندارن تا به کلمه عبور اصلی برسن. اجازه بدید با یه مثال منظورم رو بیان کنم. فرض کنید که کاربری کلمه عبور خودش رو به گفته شما tr123 گذاشته. این کلمه رو من بصورت XDF$#^ در بانک ذخیره میکنم، و برای این تبدیل از تابعی ریاضی استفاده کردم که بازگشت ناپذیره. به توابعی که ورودیهای باینری به طول دلخواه رو به خروجیهای باینری با طولهای کوچکتر و اندازه ثابت تبدیل می کنن، Hash Function یا تابع hash میگن. به خروجی هم Hash Value گفته میشه. در عمل، پیدا کردن دو ورودی متفاوت که باعث تولید خروجی یکسانی توسط تابع hash بشه، غیر ممکنه. (اگر چه مثال Mashiharu، نمونه نقضی برای این موضوع بود). بعبارت دیگه، شما نمیتونید یه ورودی دیگه به تابع hash بدید و همون خروجی ( XDF$#^) رو بگیرید.
این مساله به ما کمک میکنه تا بتونیم جاهایی که نیاز نداریم به ورودی اولیه برسیم، از Hash استفاده کنیم. یه نمونه بارز این مساله، کلمات عبور هستش. کاربر کلمه عبوری رو تعیین میکنه، ما اونو Hash میکنیم و در بانک نگه میداریم. هر وقت کاربر خواست Login کنه، ازش کلمه عبور رو میپرسیم. کلمه عبور وارد شده رو Hash میکنیم، و با مقدار ذخیره شده در بانک مقایسه میکنیم. اگر یکی بود، پس کاربر کلمه عبور رو درست وارد کرده.
اگر به System.Security.Cryptography Namespace رجوع کنید، کلاسی با نام HashAlgorithm میبینید که در واقع Base Class ای هستش برای کلاسهایی که با الگوریتمهای متفاوت می تونن Hash تولید کنن. این الگوریتمها عبارتند از MD5، MD160، SHA1، SHA256، SHA384 و SHA512. کلاسهای متانظر با این الگوریتمها هم در C# عبارتند از :
System.Security.Cryptography.MD5
System.Security.Cryptography.RIPEMD160
System.Security.Cryptography.SHA1
System.Security.Cryptography.SHA256
System.Security.Cryptography.SHA384
System.Security.Cryptography.SHA512
اما ممکنه بپرسید که اگه کاربر کلمه عبور رو فراموش کرد چی؟ در چنین حالتهایی، لینک Reset Password رو برای کاربر ارسال می کنن...
اما نکته آخر. بسیاری از برنامه نویسان کلمات عبور رو بروش فوق الذکر Hash و در بانکها ذخیره میکردن. ممکن بود دو کاربر کلمه LOVE رو بعنوان کلمه عبور خودشون انتخاب کنن، که طبیعتا Hash Value یکسانی داشت. وقتی بانک دست مهاجم می افتاد، مهاجم با روشها و Dictionary های متفاوتی که بعنوان ابزار در اختیار داشت، با نگاهی ساده به بانک متوجه فراوانی تکرار Hash Value ها میشد. مثلا، میدید کلمه XDF$#^ صد بار در بانک تکرار شده. اون میدونست که بیشترین تعداد کاربرها کلمه LOVE رو بعنوان کلمع عبور خودشون انتخاب میکنن، پس با چند تلاش ساده میدید که میتونه به سیستم Login کنه. اون یه Password رو در واقع پیدا کرده، اما صد کاربر ازین مساله متضرر شدن!
برای اینکه این اتفاق نیفته، گفتن که ازین به بعد یه رشته کاملا Random رو به کلمه عبور اضافه میکنیم، بعد کلمه جدید رو Hash میکنیم. (به اون رشته تصادفی Salt Value میگن). به این ترتیب اگر دو کاربر متفاوت کلمه عبور یکسانی هم داشته باشن، این مساله از دید مهاجم پنهان خواهد بود. کلاس RandomNumberGenerator نیز در C# به این منظور استفاده میشه.
نتیجه:
حتما از توابع Hash برای Hash نمودن کلمه عبور استفاده کنید و حتما کلمه عبور رو با Salt Value ترکیب کنید تا مشکلات فوق الذکر رخ نده.