سناریوهای فضایی کار کردن با Tor در خط فرمان

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

سناریوی اول: کار کردن با سایت‌ها از طریق پروتکل‌های معمول
تو این حالت بهترین راه استفاده از برنامه torify اه. به این ترتیب که برنامه‌ای که می‌خواید از یه سایت بسته شده استفاده کنه رو با استفاده از torify فراخونی می‌کنید. اگر هم که می‌خواید یه محیط کلا آزاد داشته باشید که می‌شه یه ترمینال غیر فیلتر راه انداخت:
[bash]
torify bash
[/bash]
تو این ترمینال هر کاری که بکنید انگار اینترنتتون غیر اسلامیه.

سناریوی دوم: کار کردن با پروتکل https
فرض کنید می‌خواید از طریق پروتکل https با github کار کنید. یا اینکه ناچارید از یه سایتی با پروتکل https چیزی دانلود کنید. در این شرایط احتمالا روش بالا بهتون کمکی نمی‌کنه. علت؟ گاهی برای بعضی پروتکل‌ها تو سیستم یه پروکسی جدا تنظیم می‌شه. برای کنترلش با دستور env کل متغیرهای محیطی سیستم رو می‌بینیم و البته با grep چیزی که دردسر ایجاد کرده رو می‌کشیم بیرون:
[bash]
mohammad@mohammad:~$ env | grep -i proxy
socks_proxy=socks://localhost:9050/
UBUNTU_MENUPROXY=libappmenu.so
https_proxy=https://localhost:9050/
[/bash]
اینجا تو خط سوم نتایج می‌شه دید که سیستم یه پروکسی جدا برای https داره. کافیه برای غیرفعال کردن این پروکسی، این متغیر رو unset کنیم:
[bash]
unset https_proxy
[/bash]
و حالا اون برنامه‌ای رو که می‌خوایم با یه چیزی مثل torsocks صدا بزنیم:
[bash]
torsocks git push
[/bash]
من از این روش برای کار با github و دانلود پکیج‌های sublimetext استفاده کردم.

سناریوی سوم: دستور sudo و tor
اگه برای کارایی مثل اضافه کردن یه پکیج ppa احتیاج داشته باشید از دستور sudo استفاده کنید، هیچ کدوم از روش‌های بالا کار نمی‌کنه. علت قضیه هم اینه که sudo داره به نوعی id کاربر جاری رو عوض می‌کنه و ما رو به root تبدیل می‌کنه. مشکل هم دقیقا از همین جاست: دو تا دستور بالا نمی‌تونن با یه برنامه‌ای که داره آی‌دی کاربر رو عوض می‌کنه کار کنن.

برای حل این مشکل من از سوییچ s دستور sudo استفاده کردم. با این سوییچ کلا به خط فرمان root منتقل می‌شیم. بعدش اونجا می‌تونیم از دستور torsocks به درستی استفاده کنیم:
[bash]
mohammad@mohammad:~$ sudo -s
[sudo] password for mohammad:
root@mohammad:~# torsocks add-apt-repository ppa:whaever
root@mohammad:~# exit
[/bash]

در آخر بگم که اگه برای مهاجرت دلیلی به جز وضعیت اسفبار اینترنت نبود، باز هم همین یک دلیل کافی بود.

به علاوه باید به شدت از نویسنده‌ها و طراحای tor با این ابزار عالیشون تشکر کرد.

کنترل حافظه برنامه با Valgrind

خیلی پیش میاد برنامه‌هایی تو cpp بنویسیم که اشکال مدیریت حافظه داشته باشن. به خصوص وقتی کارای پیچیده با پویینترها می کنیم از این دست مشکلا زیاد پیش میاد. تو این شرایط نیاز به ابزاری داریم که برنامه ما رو به لحاظ مدیریت حافظه چک کنه. خوب Valgrind عزیز ما از این دست برنامه هاست.

Valgrind
برای استفاده از Valgrind کافیه که برنامه رو با سوییچ g و ترجیحا همراه با سوییچ O0 کامپایل کنید. اولی به برنامه اطلاعات دیباگ اضافه می کنه و سوییچ دوم جلوی اپتیمایز شدن برنامه رو می گیره تا شماره خطا موقع اشکال‌زدایی درست نمایش داده بشن. فرض کنید برنامه تون که به این روش کامپایل شده اسمش باشه prog. برای کنترل این برنامه کافیه اون رو با Valgrind فراخوانی کنید:
[bash]
valgrind prog
[/bash]
Valgrind خیلی شیک و مجلسی برنامه رو اجرا می کنه و هر جا ایراد حافظه بود بهمون اعلام می کنه. دو تا سوییچ خیلی کاربردیش یکی leak-check اه که خطاهای نشت حافظه رو کنترل می کنه و دیگه track-origins=yes که دقیق مشخص می کنه این خطا مال کجای برنامه اصلیه.

Valgrind ابزارای دیگه ای مثل profiling و پیدا کردن race condition ها برای برنامه سازی موازی هم داره که می شه از مستنداتش خوند.

نکته مهم: من تو این کار خاصی که رفتم سراغ Valgrind، اگر به همه warning های کامپایلر توجه کرده بودم، اساسا مشکلم به Valgrind نمی‌کشید. روشن نگه داشتن سوییچ Wall کامپایلر و توجه به پیغاماش همیشه ایده خوبیه.

ارگونومی با چند قاعده سرانگشتی

خیلی از ما وقت زیادی از روز رو پای کامپیوتر می‌گذرونیم. درست نشستن پشت کامپیوتر تو این ساعت‌های دراز، هم به وضعیت بدنمون کمک می‌کنه و هم باعث می‌شه بازده کارمون افزایش پیدا کنه.

نشستن صحیح
خیلی ساده و با رعایت چند تا قاعده سرانگشتی می‌شه یه میز کار ارگونومیک داشت:

۱- ارتفاع نشیمنگاه باید طوری باشه که اگه زانوها ۹۰ درجه خم بشن، کف پا دقیقا روی زمین قرار بگیره. اگه ارتفاع صندلی بیش از این باشه، می‌شه از زیرپایی استفاده کرد.
۲- کمر باید صاف باشه. استفاده از یک پشتی که قوس کمر رو تامین کنه می‌تونه خیلی کمک کننده باشه.
۳- ارتفاع میز و صندلی باید طوری باشه که اگه بازوها کاملا صاف باشن و آرنج‌ها عمود خم بشن، دست راحت رو کیبرد بشینه. این یعنی محل قرارگیری کیبرد باید حداکثر ۱۲ یا ۱۳ سانت بالاتر از محل نشیمن‌گاه باشه.
۴- ارتفاع مانیتور باید طوری باشه که وقتی سر کاملا صافه، بالای مانیتور تقریبا روبروی چشم‌ها باشه. بهتره مانتور ۱۰ تا ۲۰ درجه به عقب خم باشه. می‌شه با گذاشتن چند تا کتاب و گزارش زیر مانیتور، ارتفاعش رو تنظیم کرد.

کمی در باره رمزنگاری

اول از همه بگم که رمزنگاری یه تخصصه و من به هیچ وجه متخصص رمزنگاری نیستم. برای کاری مجبور بودم کمی در باره رمزنگاری بخونم و این جمع‌بندی اون خونده هاست.

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

رمزنگاری متقارن
توی الگوریتمای رمزنگاری متقارن کلیدی که باهاش رمزگذاری می‌شه و کلیدی که باهاش رمز باز می‌شه یکسانن. فرض کنید یک فرستنده می‌خواد یه پیغام واسه یه گیرنده بفرسته. تو این حالت هر دو یه کلید مشترک دارن. فرستنده پیغامش رو با کلید مشترک رمز می‌کنه و می‌فرسته. گیرنده هم پیغام رو دریافت می‌کنه و با کلیدی که داره رمزش رو باز می‌کنه و پیغام رو می‌خونه.

مشکل این روش چیه؟ فرض کنید به علتی لازم دارید که کلیدتون رو داخل شبکه منتقل کنید. در این حالت اگر کلید به دست فرد ناجوری بیفته ممکنه که اولا بتونه تمام پیغام‌های شما رو بخونه و ثانیا از طرف هر یک از طرفین پیغام‌های غلط بفرسته.

رمزنگاری نامتقارن
در الگوریتم‌های رمزنگاری نامتقارن، کلید‌ها به صورت جفت هستند. هر جفت کلید از یک کلید عمومی و یک کلید خصوصی تشکیل شده. به لحاظ ریاضی قابل اثباته که اگر داده‌ای با هر یک از این جفت کلید رمزنگاری بشه تنها و تنها با کلید نظیر دیگه قابل رمزگشاییه. این یعنی اگه داده‌ای مثلا به یه کلید عمومی رمزنگاری بشه، تنها و تنها با کلید خصوصی نظیرش قابل رمزگشاییه (و حتی با خود اون کلید عمومی هم نمی‌شه رمزش رو باز کرد.). به دلیل وجود همین جفت کلیدها هم هست که به این الگوریتم‌ها نامتقارن می‌گن.

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

فرستنده به ترتیب این کارا رو انجام می‌ده:
۱- داده رو با کلید خصوصی خودش رمز می‌کنه.
۲- داده رو با کلید عمومی گیرنده (که همه دارن) رمز می‌کنه.
۳- داده رمزنگاری شده رو می‌فرسته.

و اون سر خط، گیرنده این کارا رو انجام می‌ده:
۱- داده رمزنگاری شده رو دریافت می‌کنه.
۲- داده رو با کلید خصوصی خودش باز می‌کنه.
۳- داده رو با کلید عمومی فرستنده باز می‌کنه.
۴- اطلاعات به شکل اولیه در دسترسه.

خوبیای رمزنگاری نامتقارن
۱- فرستنده مطمئنه فقط گیرنده می‌تونه پیغامش رو بخونه. چون پیغام رو یه بار با کلید عمومی گیرنده رمز کرده، فقط گیرنده با کلید خصوصی خودش می‌تونه اون رو باز کنه.
۲- گیرنده مطمئنه اون فرستنده مشخص پیغام رو فرستاده. چون پیغام رو داره با کلید عمومی یه فرستنده مشخص باز می‌کنه، مطمئنه این داده با کلید خصوصی فرستنده مشخص رمزگذاری شده.
۳- و مهمتر از همه این که فرستنده و گیرنده تونستن کلیدشون مبادله کنند بدون این که امنیتشون آسیبی ببینه.

امضای دیجیتال
امضای دیجیتال در واقع ساده شده سناریوی بالاست. فرض کنید برای انجام کارهاتون تو شرکت باید هویتتون تایید بشه. مثلا می‌خواید وقتی نامه‌ای بزنید یا یه تراکنش مالی انجام بدید. تو این حالت دیگه خیلی مهم نیست که کسی اطلاعاتی که می‌فرستید رو نبینه. مهم فقط اینه که مطمئن باشن که حتما این شمایید که دارید این اطلاعات رو می‌فرستید.

برای تهیه امضای دیجیتال به یه چکیده از داده‌ها احتیاجه. مثلا از یه سند چند مگابایتی، میان یه چکیده مثلا یک کیلوبایتی تهیه می‌شه. روش تهیه این چکیده طوریه که اگه حتی یه بایت تو سند اصلی جا به جا بشه، خلاصه یک کیلو بایتی ما کلا عوض می‌شه.

خوب. می‌رسیم به اصل قضیه.

فرستنده این کارا رو می‌کنه:
۱- از سندش چکیده تهیه می‌کنه.
۲- چکیده سند رو با کلید خصوصی خودش رمز می‌کنه. (به این چکیده رمز شده امضای دیجیتا می‌گن)
۳- اصل سند رو به همرای امضای دیجیتال سند می‌فرسته.

گیرنده هم متقابلا این کارا می‌کنه:
۱- از سند دریافت شده یه چکیده تهیه می‌کنه.
۲- امضای دیجیتال رو با کلید عمومی فرستنده رمزگشایی می‌کنه.
۳- کنترل می‌کنه که چکیده‌ای که خودش تهیه کرده با چکیده رمزگشایی شده برابر باشه. اگه برابر نبود یعنی سند دریافتیش دست خوردست.

واضحه که به این روش گیرنده می‌تونه از هویت فرستنده مطمئن بشه. سوالی که اینجا ممکنه پیش بیاد اینه که چرا فرستنده تمام اطلاعات رو رمزنگاری نکرد و فرستاد. جواب خیلی سادست: بحث هزینست. تهیه چکیده و بعد رمزنگاری اون خیلی سریع‌تر و بهینه‌تر از رمزنگاری کل سند اولیست.

مشکلات رمزنگاری نامتقارن
کیه که تو اینترنت بتونه اعتبار کلیدهای عمومی رو مشخص تایید بکنه؟ از کجا معلوم کلید عمومی‌ای که به دست شما رسیده همونی باشه که من تو اینترنت گذاشتم؟ یه حمله معروفیه به اسم حمله Man in the Middle. تو این روش حمله کننده یه جفت کلید تولید می‌کنه و بعد کلید عمومی خودش را جای کلید بقیه افراد تو شبکه جا می‌زنه. اتفاقی که می‌افته اینه:

۱- فرستنده اطلاعات رو با کلید خصوصی خودش و کلید عمومی تقلبی حمله کننده رمز می‌کنه.
۲- حمله کننده اطلاعات فرستنده رو دریافت می‌کنه. اطلاعات رو با با کلید عمومی واقعی فرستنده و کلید خصوصی خودش رمزگشایی می‌کنه و می‌خونه.
۳- حمله کننده اطلاعات اولیه رو (یا اراجیفی که خودش می‌خواد جا بزنه) با کلید خصوصی خودش و کلید عمومی گیرنده واقعی رمز می‌کنه.
۴- گیرنده اطلاعات رو با کلید خصوصی خودش و کلید عمومی تقلبی حمله کننده باز می‌کنه.

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

حمله Man in the Middle به خاطر این اتفاق افتاد که کلیدای عمومی تقلبی به دست کاربرا رسیده بود. اینجاست که بحث اعتبار سنجی کلیدهای عمومی تو سطح سیستم عامل و براوزرها پیش میاد. تو همه سیستم عامل‌ها روش‌هایی برای اعتبار سنجی کلیدهای عمومی پیش‌بینی شده. این اعتبار سنجی خودش بر مبنای رمزنگاری نامتقارن کلیدهای صادر شده توسط موسسات معتبره که با خود سیستم عامل نصب می‌شه و کاملا مطمئنه. جالب اینه که تو بعضی کشورها، بعضی دولت‌های اسلامی وجود دارن که کاربرا رو مجبور می‌کنن از کلیدای تقلبی استفاده کنن تا بتونن اطلاعاتشون رو بدزدن. دیگه دیگه.

حل مشکل نمایش تاریخ جلالی در وردپرس فارسی

آپدیت مهم: به پیش‌نهاد آقای غیاثی در کامنت‌ها الان از wp-paradise به جای wp-jalali استفاده می‌کنم و خیلی هم راضیم. این مشکلات رو هم نداره.

هر سری که این افزونه تاریخ جلالی رو آپدیت می‌کنیم، باید این تغییرات رو انجام بدیم تا افزونه درست کار کنه. من نمی‌دونم چرا تو اسکریپت پی‌اچ‌پی اصلی یه بار برای همیشه اینا رو اعمال نمی‌کنن؟ البته مطمئنم یه حکمتی داشته. به هر حال. راه حل مشکل تو فروم وردپرس فارسی هست:
حل کامل مشکل نمایش ندادن تاریخ شمسی در افزونه جلالی

این رو اینجا یادداشت می‌کنم تا دفعه دیگه دنیبالش نگردم.

دو متن زیر را در مسیر wp-content\plugins\wp-jalali\wp-jalali.php پیدا کرده
[php]
//add_filter(“get_the_date”,”mps_the_jdate”,10,4);
//add_filter(“get_the_time”,”mps_the_jtime”,10,4);
[/php]
و دو تا اسلش (//) اولشون رو حذف کنید .
متن زیر را هم در همین فایل پیدا کرده
[php]
if ($d == “”) $d = get_option(‘time_format’);
[/php]
نکته : دقت کنید دو مورد از متن بالا در فایل است ، شما باید متن اولی از بالا رو به متن زیر تغییر بدید.
[php]
if ($d == “”) $d = get_option(‘date_format’);
[/php]