امنیت حسابهای اجتماعی

امروز صبح در تلگرام پیامی برای من فوروارد شد که حاوی یک اسکرین شات از توییت خود شرکت توییتر بود. این اسکرین شات :

همونطوری که می‌بینید، توییتر میگه یک باگ پیدا کردن که باعث شده یک سری پسوردها، بدون این که ماسک بشن، لاگ شدن. یعنی چی؟

فرض کنیم ما یک پسورد میسازیم، پسورد ما موقعی که داریم وارد میکنیم یک چیزی مثل MySecurePassword@123456 عه. این پسورد تقریبا تمام فاکتورهای یک پسورد امن رو داره. ولی اگر به صورت Plain Text بخوایم ذخیره‌ش کنیم این که جای خود، یک میلیون کارکتر دیگر هم داشته باشه احتمال لو رفتنش بسیار بالاست. (داخل پرانتز عرض کنم خدمت آقای علیرضا شیرازی، مدیریت محترم بلاگفا که تا چند سال پیش هم همینطوری پسورد ها رو نگهداری میکرد، جای این که در توییتر و … ملت رو بخاطر مواخذه کردنتون بلاک کنید، پاسخ میدادید که چرا اینطور بود! چون همون موقع هم بسیاری از اسکریپت های مدیریت محتوا پسوردها رو ماسک می‌کردن!).
حالا بخوایم MySecurePassword@123456 رو در دیتابیسی ذخیره کنیم باید چه کنیم؟ باید از «هش» و الگوریتم های مربوطه استفاده کنیم. مثلا الگوریتم MD5 (لینک جهت مطالعه). حالا این عبارت نسبتا سخت رو من با کمک ابزارهایی که دم دستم بود به MD5 هش میکنم و نتیجه میشه :

23b7618b2a23e171e6cda057a9736423

و وقتی من پسورد رو وارد کنم، اسکریپتی که برای لاگین نوشتم، یا API ای که وظیفه لاگین کردن من رو برعهده میگیره، اول پسورد رو هش میکنه بعد در دیتابیسش چک میکنه و اگر هش یکی بود، اجازه میده من به سیستم دسترسی داشته باشم. برای مثال این یک سیستم لاگین بسیار ساده بود که خودم نوشته بودم :

کد   
post '/welcome' do
 begin 
  params[:user][:password] == params[:user][:password_again]
  user = User.create(:username => params[:user][:username], :password => Digest::MD5.hexdigest(params[:user][:password]))
  redirect to("/welcome")
 rescue
  redirect to("/signup_error")
 end
end

و این یعنی ذخیره ایمن پسورد در یک دیتابیس (در اینجا از دیتابیس های مونگو استفاده کردم). و حالا اگر اون قسمتی که مربوط به هش کردن پسورد نمیشد رو، در کد قرار میدادم چه میشد؟ وقتی قرار بود Query بزنم مثلا به یوزر mamad و پسوردش 1125 بود، اینطور بر میگردوند :

کد   
{
"username":"mamad", 
"password":"1125"
}

و مثلا اگر شما قرار بود با API ای که من برای عضوگیری سرویس نوشتم کار کنید (مثلا لاگین کردن به وسیله سرویس من در اپلیکیشن، بازی یا سیستم حضور غیاب و … )، پسوردها رو به سادگی میتونستید ببینید. اما چیزی که الان بر میگرده اینه :

کد   
{"username":"mamad","password":"c21002f464c5fc5bee3b98ced83963b8"}

و خب شما نمیتونید به پسورد دسترسی پیدا کنید، مگر این که ابزار یا دیکشنری مربوط به شکستن این الگوریتم رو داشته باشید. البته معمول هم نیست شما JSON مربوط به اطلاعات کاربران رو برگردونید! چون باز هم دیتای کاربر به خطر میفته.

فکر کنم به قدر کافی در مورد پسورد و نحوه ذخیره سازیش توضیح داده باشم، هدف این بود که مباحثی مربوط به هک شدن و نفوذ به تلگرام هم در این پست مطرح کنم که متاسفانه این پست بیش از چیزی که فکر کردم، طولانی شد. پس در مورد تلگرام در پست جداگانه ای خواهم نوشت 🙂

 

Share

لقمه را دور سر نچرخانیم – برعکس کردن یک رشته در سی شارپ

با سلام و عرض ادب خدمت خوانندگان وبلاگ. در این پست قصد دارم یکم سی شارپ رو بررسی کنم. سی شارپ، یکی از دلایل محبوب شدنش، اینه که سینتکس نسبتا ساده ای داره، ولی همین رو هم میشه پیچوند 🙂 .

مثلا این سوال رو در نظر بگیرید :

برنامه ای بنویسید که یک رشته کاراکتری از ورودی دریافت کرده و سپس آن را برعکس در خروجی قرار دهد. 

اگر فقط بخواهیم از System استفاده کنیم و یک تابع ساده بنویسیم، کد ما میشه این :

کد   
using System;
 
namespace ReverseName
{
	class MainClass
	{
		public static void NameReverse(string name){
			for (int i = name.Length; i > 0; i--){
				Console.Write(name.Substring(i-1, 1));
			}
		}
		public static void Main (string[] args)
		{
			//Challenge Accepted!
			Console.Write ("Enter a name: ");
			string n = Console.ReadLine ();
			NameReverse (n);
		}
	}
}

(اون Challenge Accepted داستانی داره که بعدا تعریف خواهم کرد 😀 ).

خب با یکم بررسی می بینید که این کد، خروجی به صورت رشته ای نداره (دستور Console.Write) و نمیشه ازش جاهایی که لازمه، استفاده کنیم. پس بهتره به جای System از System.Linq استفاده کنیم و کد رو خلاصه کنیم :

کد   
using System;
using System.Linq; 
namespace ForEach
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Console.Write ("Enter your name: "); 
			string name = Console.ReadLine (); 
			foreach (char c in name.Reverse()) {
				Console.Write (c);
			}
 
		}
	}
}

و اگر دقت کنید به جای اون for ، از foreach استفاده کردم که بسیار کار رو راحت تر کرده.

امیدوارم هر وقت خواستید کد بزنید، به این شکل و به خلاصه ترین شکل ممکن کدتون رو بنویسید.

موفق باشید 🙂

Share

ملاقات با سی شارپ

قبل تر، خیلی خیلی در مقابل یادگیری سی شارپ، مقاومت میکردم. یکی از مشکلاتی که اکثر کتابهای سی شارپ موجود داشتند، این بود که برنامه نویسی رو با نقاشی اشتباه گرفته بودند . در واقع، این که بیایم در یک کتابی که مدعی حرفه ای بودن سطح آموزش هست، از اینکه چطور یک Button رو در محیط گرافیکی به کمک ماوس بکشیم، حرف بزنیم، نشون میده میخوایم یک حیطه خیلی خاص رو به کاربر یاد بدیم. عمده این کتابها هم طوری هستن که کاربر خیلی خیلی زود، ازش دلزده میشه (یکیش خودم 🙂 ). خب اولین باری که تلاش کردم سی شارپ رو یاد بگیرم اول دبیرستان بودم. دقیقا ۴ سال پیش همین موقع ها! و خب کتابی که تهیه کردم همونطور بود و با نوشتن دو سه تا برنامه ساده چقدر ذوق زده شدم و فلان و بهمان. از این حرف ها بگذریم، الان که ترم دوم دانشگاه هستم، توفیق اجباری شده تا در سی شارپ رو یاد بگیرم (لفظ توفیق به کار برده شد تا بگم که یادگیری همیشه خوبه، حتی اگر چیزی که داری یاد میگیری، بی کاربرد یا حتی مزخرف باشه) و خب با سینتکس سی شارپ آشنا شدم. امروز تصمیم گرفتم چندین خط کد بزنم. پس بیاید در این کد زدن ها با من همسفر بشید.

سی شارپ در لینوکس

زیاد روده درازی نمی کنم، قصد اسکرین شات گذاشتنم ندارم (:D) ، ولی خب برای استفاده از این زبان در لینوکس کد زیر رو اجرا کنید :

sudo apt-get install monodevelop

بعد از نصب میتونید monodevelop رو اجرا کنید و از کد زدن با سی شارپ لذت ببرید 🙂

اولین برنامه من

در اولین برنامه سعی کردم به چاپ یک رشته احمقانه (مثل Hello World و …) بسنده نکنم. هر کانسپتی از C و ++C داشتم رو پیاده کردم. توی این کد هم کلاس ایجاد کردم، هم تابع نوشتم، هم از کاربر ورودی گرفتم، هم از حلقه تکرار استفاده کردم و … ! در واقع هرچه میدانستم پیاده کردم بدون هیچ مشکلی هم کار کرد (البته ناگفته نماند که خیلی جاهاش رو هم کمک گرفتم!) . این کد من بعد از یکی دو ساعت کار با سی شارپ :

using System;

namespace HelloWorld
{
	class Test
	{
		public static int Method(int a){
			return a;
		}
	}

	class MainClass
	{
		public static void Message(){
			Console.WriteLine ("Welcome to My Program!");
		}
		public static int SimpleFunction(int a){
			return a;
		}
		public static void Main (string[] args)
		{
			Message (); 
			Console.Write ("Enter a value: ");
			int j = Convert.ToInt32 (Console.ReadLine ());
			int i;
			for (i = 0; i<= j; i++) {
				Console.WriteLine (i);
			}
			Console.WriteLine (Test.Method(i));
		}
	}
}

جمع بندی و نکات حائز اهمیت

اگر زبانهایی مثل C یا ++C رو بلدید، دنبال سی شارپ هم بیاید، ضرر نمی کنید. فقط یک زبان C-like که تا حد زیادی با جاوا ترکیب شده رو تجربه میکنید. تجربه سی شارپ با مونو هم تجربه جالبیه! اما خب حس قشنگی نیست که فایل exe روی لینوکس اجرا بشه (مثل شتر سواری روی سطح اقیانوس میمونه یه جورایی!) ، ولی خب یادگیری هیچوقت بد نیست. بخصوص اگر مجبور باشید و درسی مثل برنامه سازی پیشرفتتون، در گرو این زبان باشه ((((: .

Share

دانلود جزوه سیستم اعداد به فرمت PDF

با سلام.

اون دسته از دانشجویان رشته کامپیوتر (چه نرم افزار و چه سخت افزار) که نیاز دارند تا سیستم اعداد رو بهتر یاد بگیرند، میتونن این جزوه رو مطالعه کنند. این جزوه رو خودم چندین بار بررسی کردم و همه چیزش خوب و به جاس، و حجمش هم کمه و برای مطالعه سریع میشه ازش استفاده کرد.

دانلود جزوه

Share