لاگین اتوماتیک به ماشین‌های راه دور

وقتی به طور مرتب با ماشین‌های راه دور کار می‌کنیم، وارد کردن اسم کاربری و پسورد تبدیل به یه پروسه حوصله سربر می‌شه. واسه همین بهتره راه حلی پیدا کنیم که مشکل لاگین رو حل کنه.
لاگین اتوماتیک به ماشین‌های راه دور دو تا روش اصلی داره:
روش اول: استفاده از فایل ‪.netrc‬
خیلی از برنامه‌هایی که با ماشین‌های راه دور کار می‌کنند می‌تونند از فایل ‪.netrc‬‬ استفاده کنند. در واقع می‌شه یوزر و پسورد برای هر ماشین رو تو این فایل ذخیره کرد تا برنامه‌های دیگه ازش استفده کنند. فرمت این فایل به این شکله:

[bash]
machine github.com
login technoweenie
password SECRET

machine api.github.com
login technoweenie
password SECRET
[/bash]

فکر کنم به قدر کافی واضحه.

نکته مهم این که این روش برای هر پروتکلی که با OpenSSH کار می‌کنه (مثل ssh، scp و sftp) کار نمی‌کنه.
روش دوم: استفاده از کلیدهای ssh
برای استثناهای حالت قبل می‌شه به راحتی از کلیدهای ssh استفاده کرد.
مراحل کار:
اول جفت کلیدهای نامتقارنمون رو می‌سازیم: (یک بار برای همیشه)
[bash]
ssh-keygen
[/bash]
چند تا سوال تو این مرحله پرسیده می‌شه که همش رو مقادیر پیش‌فرض رو قبول می‌کنیم.
تو مرحله بعد کلید عمومی به کامپوتر مقصد کپی می‌شه:
[bash]
ssh-copy-id user@example.com
[/bash]

به همین راحتی.

یه نکته درباره git: وقتی داریم از git استفاده می‌کنیم باید دقت کنیم که داریم از کدوم پروتکل استفاده می‌کنیم. برای پروتکل https راه حل اول و برای پروتکل ssh راه دوم باید استفاده بشه.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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