<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیر‌حسین</title>
        <link>https://virgool.io/feed/@mans</link>
        <description>دانشجوی مهندسی کامپیوتر در دانشگاه شهید بهشتی</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:46:30</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/58310/avatar/zc6W1u.png?height=120&amp;width=120</url>
            <title>امیر‌حسین</title>
            <link>https://virgool.io/@mans</link>
        </image>

                    <item>
                <title>حتی گوگل هم رمز حساب گوگل شما رو نمی‌دونه!</title>
                <link>https://virgool.io/@mans/%D8%AD%D8%AA%DB%8C-%DA%AF%D9%88%DA%AF%D9%84-%D9%87%D9%85-%D8%B1%D9%85%D8%B2-%D8%AD%D8%B3%D8%A7%D8%A8-%DA%AF%D9%88%DA%AF%D9%84-%D8%B4%D9%85%D8%A7-%D8%B1%D9%88-%D9%86%D9%85%DB%8C%D8%AF%D9%88%D9%86%D9%87-u4rqdpeftfc5</link>
                <description>حتی گوگل!باور کنید راست میگم! واقعا حتی خود گوگل هم رمز حساب گوگل شما رو نمی‌دونه! ممکنه بپرسید که &quot;پس چجوری موقع لاگین کردن رمز درست رو از اشتباه تشخیص میده؟؟&quot; جوابش رو در یک کلمه می‌شه خلاصه کرد: هش. تو این نوشته می‌خوایم مفهوم هش و یکی از کاربرد های جالب‌اش رو بررسی کنیم.هش (Hash) کردن یعنی چه؟هش کردن یعنی یه داده ای با طول دلخواه رو به یه تابع هش بدیم و اون تابع با انجام یه سری محاسبات ریاضی به ما یه داده‌ی دیگه بده که که بهش میگیم مقدار هش.به این صورت!تابع هش چند تا خاصیت خیلی مهم داره که بدون اون‌ها دیگه نمی‌شه بهش گفت تابع هش:قطعیت: یه تابع هش به ازای یه ورودی خاص، همیشه مقدار ثابتی برمی‌گردونه. یعنی شانس در کار نیست.یک‌طرفه بودن: می‌شه از یه داده به هش‌ اون داده رسید. اما از یه هش نمیشه یه راست به داده اولیه رسید. گفتم یه راست، چون در نهایت میشه به صورت غیر مستقیم چنین کاری رو انجام داد. مثلا اینکه بیایم همه داده هایی که به ذهنمون می‌رسه رو به تابع هش بدیم و خروجی‌هاشونو ذخیره کنیم. بعد توی خروجی‌هایی که داریم دنبال هش دلخواهمون بگردیم و داده متناظرش رو پیدا کنیم. این جوری از هش به داده می‌رسیم؛ ولی همونطور که حدس می‌زنید، اینکار بسیار بسیار سخت و هزینه‌بر و تقریباً غیرممکنه!ثابت بودن طول هش: صرف‌نظر از طول داده، تابع هش همیشه هش با طول ثابت تولید می‌کنه.عدم وجود تصادم (Collision): تصادم یعنی وقتی که یه تابع هش برای دو تا داده مختلف، هش‌های یکسان تولید می‌کنه. در یک تابع هش، پیدا کردن تصادم باید خیلی سخت باشه. نگفتم غیرممکن، چون همیشه می‌شه تصادم پیدا کرد. مثلا اگر طول داده‌ای که به تابع هش می‌دیم از طول هش (که مقدار ثابتی هست) بیشتر باشه، طبیعتا تعداد داده های ممکن از تعداد هش های ممکن بیشتر می‌شه؛ و طبق اصل لانه‌کبوتری، حداقل دو تا داده وجود داره که به یه هش یکسان متناظر شده باشه؛ و این یعنی همون تصادم. پس همیشه تصادم هست؛ اما نکته مهم اینه که پیدا کردن داده هایی که تصادم ایجاد می‌کنن باید سخت باشه. (یه چیز بامزه: گوگل و یه گروه دیگه با همکاری هم دوتا فایل pdf متفاوت ساختن که هش اون‌ها با الگوریتم SHA1 دقیقا یکی می‌شه! از اون به بعد، SHA1 تقریبا منسوخ شد. اطلاعات بیشتر و دانلود اون pdf ها: shattered.io)اینا مهم‌ترین خواص تابع هش بودن؛ اما خواص دیگه‌ای هم وجود دارن که اینجا بهشون اشاره نمی‌کنیم.هش و امنیت رمزعبورهاهش کردن داده‌ها کاربرد های فراوانی داره. از پیدا کردن یه عنصر تو یه آرایه گرفته تا بررسی درستی محتویات  فایل‌ها و ارز‌های دیجیتال و... . اما یکی از دم‌دستی ترین کاربرد‌های هش، ذخیره رمزعبور‌ها در یک دیتابیس هست. به این صورت که یک سایت که می‌خواد مشخصات کاربرانش (مثل رمزعبور) رو ذخیره کنه، به جای ذخیره متن رمزعبور، اون رو هش می‌کنه و فقط هش‌ها رو تو دیتابیس ذخیره می‌کنه. اما چرا؟مثلا یک سایت نه چندان خوب رو در نظر بگیرید که رمزعبور کاربرانش رو به همون شکل توی دیتابیس‌اش ذخیره می‌کنه. اگر یک روز، یه هکر به این سایت حمله می‌کنه و بتونه محتویات دیتابیس رو بیرون بکشه، چون رمزها به همون شکل تو دیتابیس ذخیره شده بوده، اون هکر خیلی راحت به همه حساب‌های کاربری اون سایت دسترسی پیدا می‌کنه!حالا یه سایت خوب رو در نظر بگیرید که موقع ذخیره رمزعبورها، به جای خود رمزعبور، هش اون‌ها رو ذخیره می‌کنه. همون هکر‌ها به این سایت هم حمله می‌کنن و دیتابیس‌اش رو هم بیرون می‌کشن. اما چون فقط هش رمزعبورها توی دیتابیس موجوده و همون‌طور که گفتیم، هش‌ها برگشت‌پذیر نیستن، هکرها برای دسترسی به رمزعبورها به مشکل می‌خورن و اون سایت خوب در امان می‌مونه! (البته این فقط یه مثال بود، وگرنه نمی‌شه گفت چنین سایتی حتما در امان می‌مونه...)مثالی از نحوه ذخیره شدن رمز در دیتابیس. خبری از خود رمزها نیست!اما سایت‌هایی که هش ذخیره می‌کنن، چجوری موقع لاگین می‌فهمن که کاربر داره رمز درست رو وارد می‌کنه یا نه؟ جواب این سوال، ساده‌اس! سایت‌ها موقع لاگین، رمزی که کاربر وارد می‌کنه رو هم هش می‌کنن؛ بعد این هش رو با هش موجود توی دیتابیس‌شون مقایسه می‌کنن. چون الگوریتم هش تصادم نداره، در صورت یکی بودن هش‌ها می‌شه به این نتیجه رسید که رمز‌عبور‌ها هم یکیه! و به این صورت درست بودن رمز تشخیص داده می‌شه.همه سایت‌های کوچیک و بزرگی که سرشون به تنشون می‌ارزه (:دی)، اینطوری رمزها رو ذخیره می‌کنن. اما برای سایت‌های بزرگ‌تر و با داده‌های حساس‌تر (مثل گوگل، توییتر، و...)، علاوه بر هش کردن، کار دیگه‌ای هم انجام می‌شه تا امنیت رمزعبورها حتی بیشتر هم بشه. اون‌ها قبل از هش کردن، یه عبارت ثابت و سری رو به متن رمز اضافه می‌کنن و بعد کل متن به دست اومده رو هش می‌کنن. مثلا اگر رمز من باشه apple1234 و اون عبارت سری هم باشه GoLdEnOnIoN، چیزی که تو دیتابیس ذخیره می‌شه هش عبارت &quot;apple1234GoLdEnOnIoN&quot; خواهد بود (البته این عبارت الزاماً به انتهای رمزعبور اضافه نمی‌شه). اینجوری حتی اگر با روش های سخت و زمان‌بر، یه هکر به رمز متناظر با هش برسه، باز به رمز اصلی نمی‌رسه و کارش سخت‌تر هم میشه! به این کار میگن نمک‌زدن (Salting)!اول نمک می‌زنیم، بعد هش می‌کنیم!پس همونطور که دیدید، حتی گوگل هم رمزعبور کاربراشو نمی‌دونه! برای همین هست که وقتی رمز‌عبورتون رو فراموش می‌کنید، به جای رمزتون، یه لینک برای تعویض پسورد یا یه پسورد جدید موقت براتون می‌فرستن؛ نه خود رمز رو! اگر دیدید سایتی احیاناً رمز خودتون رو براتون ایمیل کرد، یعنی به شکل ناایمنی رمز‌ها رو ذخیره می‌کنه و...خلاصهاکثر سایت‌ها رمز عبور کاربراشون رو نمی‌دونن! و این به دلیل نحوه ذخیره رمز عبور‌ها در دیتابیس اون سایت ها هست. رمزها به صورت هش (Hash) شده ذخیره میشن. هش کردن، فرآیندی هست که در اون، یک داده به یک تابع هش داده می‌شه و با انجام محاسبات ریاضی، یک هش محاسبه می‌شه. تابع هش خواصی داره. مثلا اگر یه داده خاص رو به تابع هش بدیم، اون تابع همیشه یک هش یکسان برای اون داده برمی‌گردونه. همچنین طول هش تولید شده توسط یک تابع، همیشه ثابته. یک تابع هش یک‌طرفه هست؛ یعنی با داشتن داده، میشه هش اون رو به دست آورد؛ ولی با داشتن هش، نمی‌شه داده رو به دست آورد (مگر به وسیله راه‌های سخت و هزینه‌بر!). همچنین از دو تا داده مختلف معمولا دو تا هش مختلف به دست میاد؛ مگر در مواردی خاص، که پیدا کردن اون موارد خاص باید خیلی سخت باشه. هش کردن در خیلی جاها کاربرد داره. یکی از کاربرد‌های اون، ذخیره رمزعبور در دیتابیس‌ها هست. اگر به جای متن رمز، رمز رو هش کنیم و فقط هش رو در دیتابیس ذخیره کنیم، در صورت هک شدن دیتابیس، دسترسی به رمزعبورها غیرممکن یا حداقل بسیار سخت می‌شه. همچنین برای بررسی درست بودن رمز موقع لاگین، رمزی که کاربر وارد می‌کنه هش می‌شه و درصورت یکی بودن این هش با هش ذخیره شده در دیتابیس، درستی رمز تایید می‌شه. می‌شه نتیجه گرفت که چون فقط هش در دیتابیس ذخیره می‌شه، صاحب سایت از متن رمز خبر نداره. در سایت‌هایی که اطلاعات حساس‌تر ذخیره می‌شه، علاوه بر هش کردن، متن رمز کمی دستکاری می‌شه (مثلا چیزی بهش اضافه می‌شه) و بعد هش کردن انجام می‌شه. این‌کار، باعث می‌شه تا حتی اگر دیتابیس لو رفت و رمزها از هش‌ها به دست اومد، رمز به دست اومده رمز اصلی نباشه. این روش در اکثر سایت‌ها استفاده می‌شه و یک استاندارد هست.</description>
                <category>امیر‌حسین</category>
                <author>امیر‌حسین</author>
                <pubDate>Tue, 17 Sep 2019 23:27:13 +0430</pubDate>
            </item>
                    <item>
                <title>چالش تولید اعداد تصادفی در کامپیوتر</title>
                <link>https://virgool.io/@mans/%DA%86%D8%A7%D9%84%D8%B4-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C-%D8%AF%D8%B1-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-gnfprr03onk7</link>
                <description>اگر حوصله خوندن ندارید، خلاصه ای که در آخر اومده رو بخونید.اگر یه سکه رو یک بار پرتاب کنید و شیر بیاد، آیا می‌تونید بگید که در پرتاب بعدی شیر میاد یا خط؟ شما نمی‌تونید جواب دقیقی به این سوال بدید. در واقع شیر یا خط بودن سکه قابل پیش‌بینی نیست. به اینجور پدیده‌ها می‌گیم تصادفی. یعنی پدیده‌هایی که در روند حاکم بر اون‌ها قاعده و الگویی وجود نداره و در نتیجه نمی‌تونیم پیش‌بینی‌شون کنیم.مثل این!همینطور ما اعداد تصادفی رو داریم. که در واقع دنباله ای از اعداد هستن که با داشتن چن‌تا‌شون نمی‌شه عدد بعدی رو حدس زد یا پیش‌بینی کرد. کاربرد اعداد تصادفی خیلی وسیعه. مثلا فرض کنید می‌خوایم اطلاعات محرمانه‌ای که بین دو تا کامپیوتر تو اینترنت رد و بدل می‌شه رو رمزنگاری کنیم تا لو نره. (همچین چیزی توی اینترنت خیلی متداوله. مثلا هر سایت HTTPS ای رو که باز می‌کنید، ترافیک شما و اون سایت رمزنگاری می‌شه). برای فرایند رمزنگاری، باید یه کلید بسازیم. کلید، یه عدد بزرگ هست که هر دو طرف گیرنده و فرستنده اون رو می‌دونن؛ و اگر کس دیگری هم اون رو بدونه، می‌تونه پیام های رمزنگاری شده رو رمزگشایی کنه! بنابراین، کلید باید غیر قابل حدس باشه. برای همین، معمولا کلید رو بر پایه اعداد تصادفی می‌سازن که غیر قابل حدس و پیش‌بینی هستن؛ در نتیجه کلید هم غیر قابل پیش‌بینی می‌شه و امن تر می‌مونه.مثل همین قضیه کلید رمزنگاری، جاهایی هست که کامپیوتر ها باید از اعداد تصادفی استفاده کنن. اما برای این کار، اول باید این عدد رو تولید کنن! این کار به نظر ساده میاد. ولی اگر دقت کنیم، می‌بینیم که مشکلی وجود داره. اساساً کاری که کامپیوتر ها انجام می‌دن، انجام یه سری دستورات از پیش تعیین شده (الگوریتم) هست. به ازای یه ورودی ثابت و یه الگوریتم ثابت، یه خروجی ثابت وجود داره؛ و اگر اون ورودی رو هزار میلیارد بار به اون الگوریتم بدیم، در هر هزار میلیارد بار خروجی یکسانی می‌بینیم. پس خروجی یه الگوریتم به ازای یه ورودی خاص، چیزی قابل پیش‌بینی هست. نتیجه می‌شه که خروجی هیچ الگوریتیمی تصادفی نیست؛ پس خروجی کاری که کامپیوتر انجام می‌ده هم تصادفی نیست. پس کامپیوتر نمی‌تونه عدد تصادفی تولید کنه!با این اوصاف، تولید اعداد تصادفی در کامپیوتر ها یه چالش سخت به حساب میاد. اما برای گذر از این چالش، راه‌کار های عملی‌ای هست که تو این نوشته می‌خوایم مختصر بررسی‌شون کنیم.مولد اعداد شبه تصادفی (PRNG)درواقع در خیلی از مواقع، همین که یه دنباله عدد بسازیم که تصادفی به نظر بیاد، حتی اگر واقعا تصادفی نباشه، کار ما رو راه می‌اندازه. مثل:به نظر تصادفی میان. ولی در واقع نظم پنهانی دارن!عدد ۷۵۳۱ رو بردارید.به توان ۲ برسونید. (=۵۶۷۱۵۹۶۱)چهار رقم وسط حاصل رو بردارید. (=۷۱۵۹)و اینم عدد بعدی! حالا اگر این کار ها رو با ۷۱۵۹ انجام بدید، به ۲۵۱۲ می‌رسید! همینطور به ۳۱۰۱، ۶۱۶۲ و ...همونطور که می‌بینید، این اعداد کاملا دارای الگو هستن، در حالی که ظاهرا نیستن! این اعداد رو می‌شه با الگوریتم در کامپیوتر ساخت. به چنین الگوریتم هایی میگن &quot;مولد اعداد شبه تصادفی&quot; یا PRNG (Pseudo Random Number Generator). خروجی چنین الگوریتم هایی در نهایت قاعده دارن و قابل پیش‌بینی هستن. ولی در ظاهر شبه تصادفی هستن.نکته جالب در مورد این الگوریتم ها اینه که بعد از یه مدت، خروجی‌ها‌شون هی تکرار می‌شه! مثلا تو همین مثال بالا اگر الگوریتم رو ۱۰۰ بار اجرا کنیم، به این عددا می‌رسیم:از عدد ۴۷ ام به بعد، اعداد به شکل ضایع‌ای تکرار شدن! و این، خروجی الگوریتم رو از تصادفی بودن دور می‌کنه. برای همین الگوریتم های PRNG باید به اندازه کافی پیچیده باشن تا چنین مشکلاتی به حداقل برسه. یا اصطلاحا، دوره تناوب بالایی داشته باشن.الگوریتمی که تو دو تا مثال بالا استفاده کردیم، از اولین الگوریتم های PRNG هست و اسمش هم هست &quot;میان-مربع&quot; (Middle-square). به دلایل واضحی، این الگوریتم منسوخ شده و دیگه ازش استفاده نمی‌شه.مولد اعداد تصادفی واقعی (TRNG)در شرایط ساده ای، مثل طراحی بازی، استفاده از PRNG ها جواب می‌ده. اما در شرایط حساس، مثل تولید کلید برای رمزنگاری، استفاده از الگوریتم های PRNG می‌تونه خطرناک باشه. چون احتمال این که کلید توسط اشخاص ناخواسته حدس زده بشه و دوباره تولید بشه رو بالا می‌بره؛ و این می‌تونه باعث لو رفتن پیام رمزنگاری شده بشه. در این شرایط ما به اعداد واقعا تصادفی احتیاج داریم. اما همونطور که بالاتر گفتیم، کامپیوتر نمی‌تونه اعداد واقعا تصادفی تولید کنه. یه راهش اینه که به جای الگوریتم های کامپیوتری، از سخت افزاری استفاده کنیم که پدیده های فیزیکی قابل اندازه گیری که تصادفی هستن رو اندازه بگیره و نتیجه‌اش رو به کامپیوتر بده. یه مثالش می‌تونه این باشه که مثلا شما یه ‌میکروفون متصل به کامپیوتر رو یه جای پرسروصدا نصب کنید؛ و اون میکروفون، شدت صدایی که بهش می‌رسه رو به صورت یه عدد مدام به کامپیوتر گزارش کنه. شدت صدایی که به اون میکروفون می‌رسه، چیزی نیست که بشه پیش‌بینی‌اش کرد. در نتیجه می‌شه یه چیز تصادفی.در عمل راه های ساده‌تری هم هست. مثلا اگر در یک کامپیوتر خونگی حرکات موس یا فاصله زمانی بین ضربه های کلید کیبورد رو ضبط کنید، این می‌تونه یه منبع برای تولید اعداد تصادفی باشه! این روشی هست که در لینوکس یا سیستم عامل های شبه-یونیکس استفاده می‌شه. نکته کوچولو: در لینوکس در فایل dev/random/ می‌تونید بایت های واقعا تصادفی که به این روش تولید شدن رو ببینید.خروجی dev/random/ که به شکل کاراکتر های تصادفی و عجیب غریب دیده می‌شه. در عمل سرعت تولید این بایت ها خیلی کمتر از چیزی که اینجا دیده می‌شه هست.در سایت Random.org می‌تونید اعداد تصادفی واقعی تولید کنید. طبق گفته این سایت، از &quot;نویز جوی&quot; به عنوان یه پدیده فیزیکی تصادفی برای تولید اعداد تصادفی استفاده می‌شه:RANDOM.ORG uses radio receivers to pick up atmospheric noise, which is then used to generate random numbers.سایت RANDOM.ORG از گیرنده های رادیویی استفاده می‌کند تا نویز جوی را دریافت کند، که بعدا برای تولید اعداد تصادفی استفاده می‌شود.خلاصهپدیده های تصادفی، پدیده‌هایی هستن که نظم و الگوی خاصی ندارن. اعداد تصادفی هم نمونه ای از اون‌ها هستن. ما در خیلی از شرایط به اعداد تصادفی نیاز داریم. مثلا در اینترنت برای انتقال اطلاعات به صورت رمزنگاری شده، نیاز به اعداد تصادفی داریم تا از لو رفتن کلید استفاده شده برای رمزنگاری جلوگیری کنیم. کامپیوترها اساساً نمی‌تونن اعداد تصادفی تولید کنن. چون کامپیوتر ها الگوریتم اجرا می‌کنن؛ و خروجی هر الگوریتمی یه چیز کاملا قابل پیش‌بینی هست. در نتیجه، تولید اعداد تصادفی یه چالش به حساب میاد. یه راه برای دور زدن این چالش، استفاده از الگوریتم‌هایی هست که اعدادی تولید می‌کنن که تصادفی نیستن، اما در ظاهر تصادفی به نظر میان. به چنین الگوریتم هایی &quot;مولد اعداد شبه تصادفی&quot; یا PRNG گفته می‌شه. هرچند برای کاربرد های ساده، این الگوریتم ها جواب می‌دن، اما برای کاربرد های حساس‌تر مثل تولید کلید برای رمزنگاری، که در اون لو نرفتن کلید خیلی مهمه، استفاده از PRNG ها خوب نیست و ما مجبوریم اعداد تصادفی واقعی تولید کنیم. برای تولید اعداد تصادفی واقعی، می‌تونیم پدیده‌های فیزیکی قابل اندازه‌گیری که تصادفی هستن رو اندازه بگیریم و اعداد به دست اومده از اندازه‌گیری ها رو تصادفی در نظر بگیریم.</description>
                <category>امیر‌حسین</category>
                <author>امیر‌حسین</author>
                <pubDate>Sat, 10 Aug 2019 22:11:19 +0430</pubDate>
            </item>
                    <item>
                <title>درباره DoH: دی‌ان‌اس + HTTPS</title>
                <link>https://virgool.io/@mans/%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-doh-%D8%AF%DB%8C%D8%A7%D9%86%D8%A7%D8%B3-https-tk1jgpnbrvm1</link>
                <description>این اولین نوشته من در ویرگول هست. شدیداً پذیرای نظرات شما در قسمت کامنت‌ها هستم :)اگر حوصله خوندن ندارید، خلاصه‌ای که در آخر اومده رو بخونید.پروتکل DNS برخلاف بسیاری از پروتکل هایی که در دنیای وب کاربرد زیادی دارن، هنوز از رمزنگاری پشتیبانی نمی‌کنه. این یعنی کسی که به ترافیک اینترنت کاربری دسترسی داره، می‌تونه بدون زحمت خاصی ببینه که اون کاربر به چه سایت‌هایی می‌ره؛ یا حتی بدتر از این، می‌تونه ترافیک مربوط به DNS Query هاش رو دستکاری کنه! (حمله DNS Hijacking)در بعضی از کشور ها، ISP ها برای اهداف خاصی از این حمله ها روی کاربران خودشون انجام می‌دن! یکی از این اهداف، فیلترینگ هست. به این صورت که وقتی یه کاربری DNS Query مربوط به یه سایت غیر‌مجاز رو ارسال می‌کنه، سرور DNS اون ISP، که به طور پیش‌فرض روی کامپیوتر اون کاربر تنظیم شده، یه آی‌پی الکی به کاربر برمی‌گردونه که هیچ ربطی به سایت مورد نظرش نداره و اونو به یه سایت دیگه می‌بره! مثلا تو ایران، این آی‌پی الکی، مربوط به سایت پیوندها هست. :)در بیشتر موارد، استفاده از سرور DNS ای غیر از سرور پیشفرض ISP مشکل رو حل می‌کنه. اما مثلا در ایران، حتی عوض کردن DNS هم مشکلی رو حل نمی‌کنه! چون همونطور که بالاتر گفتیم، DNS رمزنگاری نمی‌شه و توسط کسی که به ترافیک اینترنت شما دسترسی داره قابل دستکاری هست؛ مثل ISP شما! درواقع اگر شما از هر سرور DNS دیگه‌ای هم استفاده کنید، باز ISP می‌تونه با دستکاری جواب Query ای که کامپیوتر شما فرستاده، شما رو باز به همون آی‌پی الکی برسونه.تقریباً به تازگی، چیزی معرفی شده به نام DNS over HTTPS یا DoH؛ که کارش رمزنگاری کردن ترافیک DNS هست. نتیجش اینه که دیگه ترافیک DNS قابل دستکاری نخواهد بود! تو این نوشته می‌خوایم درباره این DoH بصورت مختصر آشنا بشیم.کوئری های رمزگذاری نشدهاول از همه، می‌خوایم ببینیم کوئری های DNS چه شکلی ان. برای این کار، DNS سیستم رو تنظیم می‌کنیم روی مثلا 1.1.1.1: (می‌شه از DNS های دیگه هم استفاده کرد)تنظیمات مربوط به شبکه در Linux و میزکار Gnome. دی‌ان‌اس روی 1.1.1.1 تنظیم شده.اینجا از Wireshark استفاده می‌کنم تا همه پکت‌هایی که بین کامپیوترم و اینترنت رد و بدل میشه (مثل پکت های مربوط به DNS Query ها) رو با جزئیات ببینم. حالا Wireshark رو باز می‌کنم و در مرورگر آدرس یه سایتی رو وارد می‌کنم؛ مثل virgool.io. وقتی به Wireshark برگردیم، پکت های مربوط به DNS Query ها رو می‌بینیم. یکی از اون‌ها، DNS Query مربوط به سایت ویرگول هست:اون پایین محتویات خام پکت رو می‌بینید که چون رمزنگاری نشده آدرس سایت توش مشخصه. اون وسط هم آدرس و آی‌پی ویرگول که از سرور DNS گرفتیم رو می‌بینید.اما اگر همین کار رو برای یه سایت فیلتر شده مثل Youtube.com انجام بدم، به جای آی‌پی واقعی یوتیوب، به آی‌پی پیوندها می‌رسیم:پکت مربوط به DNS Query یوتیوب؛ که آی‌پی پیوندها رو به جای آی‌پی یوتیوب در اون می‌بینیم!همونطور که می‌بینید، کوئری توسط ISP محترم دستکاری شد!و حالا، DoH وارد می‌شود!پروتکل DoH، چیزی شبیه همون DNS خودمون هست؛ با این تفاوت که ترافیک شما و سرور در اون رمزنگاری می‌شه. در این حالت، فقط سرور DNS و کاربر می‌تونن محتویات Query ارسال شده رو ببینن. نه ISP، و نه هیچ کس دیگه ای که ترافیک شما رو در کنترلش داره، نمی‌تونه ترافیک DNS شما رو حتی ببینه! چه برسه به این که بخواد دستکاریش کنه...وقتی از DoH استفاده می‌کنیم. چون ترافیک رمز گذاری شده، WIreshark حتی نمی‌تونه تشخیص بده که این پکت مربوط به یه DNS Query هست! (برخلاف اسکرین‌شات های قبلی)در DoH از پروتکل HTTPS استفاده می‌شه. HTTPS پروتکل امنی هست و داده‌ها توش رمزنگاری می‌شن. درواقع انگار کامپیوتر شما بجای اینکه خالی خالی (یا تکنیکی‌تر بخوایم بگیم، بصورت Plain Text) کوئری ها رو ارسال کنه، اون ها رو در قالب درخواست های HTTPS می‌فرسته که رمز نگاری می‌شن. عین وقتی که از یک سایت HTTPS بازدید می‌کنید. برای همین موضوع هست که به این پروتکل میگن DNS over HTTPS.چجوری از DoH استفاده کنیم؟الان که این متن رو می‌نویسم، متاسفانه DoH به طور پیشفرض در سیستم عامل های امروزی پشتیبانی نمی‌شه (البته گویا در Android Pie این قابلیت به طور پیش‌فرض وجود داره). اما راهکار هایی هست که DoH رو در کامپیوتر یا موبایلمون فعال کنیم:در لینوکس و ویندوز: درباره DNSCrypt گوگل کنید. فکر می‌کنم نحوه راه اندازیش از حوصله این متن خارج هست.در اندروید و iOS: کلاودفلر (CloudFlare) که دی‌ان‌اس معروف 1.1.1.1 مال این شرکت هست، اپلیکیشنی برای اندروید و iOS داره که می‌تونید باهاش بدون دردسر با استفاده از DoH به این DNS متصل بشید. (گوگل پلی | اپ استور). همچنین در اندروید، اپلیکیشن Intra می‌تونه با استفاده از DoH شما رو به دی‌ان‌اس های معروفی که از این پروتکل پشتیبانی می‌کنن وصل کنه.خلاصهپروتکل DNS یک پروتکل رمزنگاری نشده هست. به همین دلیل ترافیکش توسط ISP ها قابل دستکاری هست. در واقع ISP ها با دستکاری کوئری های DNS مربوط به سایت های غیر مجاز، شما رو به یه آی‌پی الکی می‌رسونن که مثلا می‌تونه مربوط به صفحه پیوندها باشه! حتی اگر از سرور DNS مربوط به ISP تون استفاده نکنید، باز هم ISP می‌تونه جواب کوئری هایی که از سرور میاد رو دستکاری کنه و شما رو به همون آی‌پی الکی ببره. DoH که مخفف DNS over HTTPS هست، با رمزنگاری ترافیک DNS تون، باعث می‌شه که دیگه نشه کوئری ها رو دستکاری کرد و فقط شما و سرور DNS از محتویات کوئری ها باخبر باشید. DoH از پروتکل HTTPS برای ارسال کوئری ها استفاده می‌کنه که این یعنی کوئری ها رمزنگاری می‌شن. استفاده از DoH روی اکثر سیستم عامل های امروزی به طور پیش‌فرض ممکن نیست. اما ابزار هایی برای سیستم عامل های کامپیوتر و موبایل وجود دارن که به شما امکان استفاده از DoH رو ‌می‌دن؛ که در متن اون‌ها رو معرفی کردیم.</description>
                <category>امیر‌حسین</category>
                <author>امیر‌حسین</author>
                <pubDate>Wed, 17 Jul 2019 21:14:26 +0430</pubDate>
            </item>
            </channel>
</rss>