شرح تشفير الواتساب (بروتوكول Signal)

أنواع المفاتيح العامة (مفتاح خاص و آخر عام ينشأ باستخدام Curve25519)
  • مفتاح التعريف، يتم إنشاؤه أثناء تركيب التطبيق.
  • مفتاح ابتدائي، ينشأ أثناء التركيب و يجدد بشكل دوري وموقع بواسطة مفتاح التعريف.
  • مفاتيح الاستخدام الواحد، تنشأ حسب الحاجة.
أنواع مفاتيح الجلسة (مفاتيح تماثلية)
  • مفتاح رئيس.
  • مفتاح تسلسلي، ينشأ بالمفتاح الرئيس.
  • مفاتيح الرسائل، تنشأ بالمفاتيح التسلسلية.

عند تركيب التطبيق يقوم البرنامج بإرسال المفاتيح العامة لكل من مفتاح التعريف والمفتاح الابتدائي ومجموعة من مفاتيح الاستخدام الواحد لخوادم الواتساب. يحتفظ الخادم بهذه المفاتيح مع حساب المستخدم. المفاتيح الخاصة تبقى دائما مع المستخدم فقط.

إعداد جلسة المحادثات بين طرفين

المراسلات في نظام التشفير الجديد كلها مشفرة وذلك يشمل رسائل الإعداد الأولي ولتحقيق ذلك يقوم المرسل باستخدام المفاتيح العامة للمستقبل والتي يحصل عليها من خادم الواتساب¹. يرسل الخادم للمرسل مفاتيح المستقبل وهي مفتاح التعريف ومفتاح ابتدائي و أحد مفاتيح الاستخدام الواحد². فيقوم المرسل باستخدام مفاتيحه الخاصة و مفاتيح المستقبل العامة لإنشاء المفتاح السري (باستخدام بروتوكول ECDH) ويستخدم المفتاح السري في عملية تشفير الرسائل قبل إرسالها للمستقبل. كما يقوم المرسل بإرفاق مفاتيحه العامة مع الرسائل الأولى إلى أن يتم إنهاء إعداد الجلسة.

عندما تصل الرسائل للمستقبل يقوم باستخدام مفاتيحه الخاصة والمفاتيح العامة للمرسل والتي أرسلت له مع الرسالة وينشئ منها نفس المفتاح السري الذي أنشاءه المرسل (هذه هي عبقرية بروتوكول ديفي-هيلمان) ومن ثم يقوم باستخراج المفتاح الرئيس كما فعل المرسل ويستخدمه في عملية فك تشفير الرسائل وبهذا تكون الجلسة قد أعدت بين الطرفين وكلاهما يحمل مفاتيح تشفير الرسائل.

تشفير الرسائل

لكل رسالة تنشأ مفاتيح تشفير جديدة لدى الطرفين ولها هذه المميزات:

  1. المفاتيح لدي الطرفين متشابهة (شكرا لبروتوكول ديفي-هيلمان)و تنشأ من مفاتيحهم العامة والخاصة.
  2. مفتاح كل رسالة مستقل عن ما قبله وما بعده، فضياع الرسالة لا يوثر على سير التراسل. واكتشاف احد المفاتيح لا يمكن من فك تشفير الرسائل السابقة.
  3. لا يمكن استنباط المفاتيح الأصلية من مفاتيح الرسالة.
  4. المفتاح يستخدم لتشفير رسالة واحدة فقط ولا يعاد استخدامه؟

هذه المميزات تجعل عملية ربط رسالة مشفرة بمرسل معين مستحيلة، فالتحقق من صحة الرسالة ممكن لكن التحقق من هوية المرسل مستحيلة وهذه مفيدة في حال المراسلات الحساسة والتي يخشى فيها المرسل مثلا من محاكمته واتهامه بإرسال تلك الرسائل. لكن في نفس الوقت هذه الميزة تجعل عملية التحقق من هوية الطرف الآخر مستحيلة لذلك يتم استخدام مفتاح الاستخدام الواحد** وكذلك خاصية التحقق من خلال تطبيق الواتساب ومطابقة رمز التحقق يدويا مع الطرف الآخر لتجاوز هذه الثغرة.

ملفات الوسائط (الفيديو والصور و الصوت) والمستندات يتم تشفيرها بنفس الأسلوب. وعند استقبال ملف من شخص وتمريره لشخص آخر تتم عملية تشفير الملف بمفاتيح خاصة بالشخص اﻵخر وإرسال الملف المشفر من جديد.

تشفير رسائل المجموعات

بأسلوب مشابه تقريباً لطريقة المراسلات بين طرفين يقوم المرسل عند إرسال رسالته الأولى بإنشاء جلسة للمجموعة وذلك بالتخاطب مع جميع أعضاء المجموعة كل على حدة وبتشفير مختلف عن الآخرين ويرسل لهم مفتاح موحد خاص به يسمى مفتاح المرسل. يقوم المرسل بعدها باستخدام ذلك المفتاح لإنشاء مفاتيح التشفير لكل رسالة (مفتاح تسلسلي ومفتاح الرسالة) ويستخدم تلك المفاتيح لتشفير رسائله وإرسالها للخادم والذي بدورة يقوم بتوزيع تلك الرسالة لجميع أعضاء المجموعة. جميع الأعضاء يملكون مفتاح المرسل فيقومون باستخدامه لاستخراج المفاتيح التي تتيح لهم فك تشفير تلك الرسالة والرسائل القادمة.

عندما يقوم احدهم بمغادرة المجموعة يقوم بقية الأعضاء بمسح جميع مفاتيح المرسلين وإعادة إنشاء جلسات المجموعة من جديد.

التخاطب مع الخادم

بالإضافة لتشفير الرسائل بين المستخدمين فإن تطبيق الواتساب (في أجهزة الاندرويد والايفون والويندوز فون فقط) يقوم كذلك بتشفير قناة الاتصال مع الخادم وذلك يمنع من لديهم القدرة على التجسس على الشبكة من معرفة مالذي يقوم به المرسل ومع من يتحدث.

هل نثق في التطبيق الآن؟

يوفر تطبيق الواتساب خيار يمكن تفعيلة من خلال صفحة إعدادات الأمان لتنبيه المستخدم عندما يتغير مفتاح التعريف لأي من المستخدمين المعرفين لديه. ومفتاح التعريف يتغير عند تغيير جهاز الهاتف أو إعادة تركيب التطبيق أو قيام احدهم بانتحال شخصية الطرف الآخر لذا يجب التحقق من هوية الطرف الآخر ومطابقة رمز التحقق إذا كانت سرية المحادثة مهمة.

* يصعب الوثوق في تطبيق الواتساب وتشفيره لعدة أسباب منها:

  1. كون التطبيق مغلق المصدر مما يصعب عملية التحقق من طريقة عملة ومطابقتها مع ما اعلن عن طريقة عمل بروتوكول التشفير.
  2. كون التطبيق لا يزال يدعم التراسل غير المشفر للتوافق مع الإصدارات القديمة التي لا تدعم التشفير وأن وعملية الانتقال للتشفير تمت بشكل تلقائي من الشركة بدون موافقة المستخدم أو القدرة على اختيار نوع التراسل فهذا يعني أن الشركة قادرة على تعطيل التشفير لشخص معين دون علمه. وبما أن التطبيق يدعم التراسل بالطريقتين فالتحقق من ما يقوم به التطبيق صعب ويحتاج مراقبة مستمرة.
  3. كون بروتوكول Signal مصمم في الأصل ليوفر خاصية الإنكار (repudiation وهو عكس non-repudiation) والتي تمكن المرسل من إنكار علاقته بالرسائل التي قام هو بإرسالها فإن عملية التحقق تعتمد على الثقة بخادم الواتساب بالإضافة لعملية مطابقة رمز التحقق يدويا من كلا الطرفين.

وضع الآمان في التطبيق بعد إضافة خاصية التشفير يعد افضل من السابق بمراحل عدة خصوصا للمستخدم العادي ويعتبر من أكثر الحلول المتوفرة أمناً في تطبيقات المحادثات المشهورة حالياً. أما من يبحث عن أمان مطلق فعليه استخدام أدوات ووسائل أخرى لا تتطلب الثقة بطرف ثالث أو استخدام عدة حلول بتقنيات مختلفة مع بعض.

المصادر: WhatsApp-Security-Whitepaper و whispersystems.org
¹ هذه احد نقاط الضعف في التشفير، إذ يجب الثقة في الخادم وان المفاتيح المرسلة تخص المستقبل الحقيقي.
² يقوم الخادم بحذف المفتاح بعد استخدامه ولا يقبل استخدامه مرة أخرى، وفي حال استنفذت جميع مفاتيح الاستخدام الواحد ولم يستطع الخادم طلب مفاتيح جديدة من المستقبل لعدم وجودة online فإن العملية تتم بدونها. وهذه نقطة ضعف أخرى إذ يستطيع المخترق استغلالها بإنشاء طلبات اتصال وهمية حتى تستنفذ جميع مفاتيح الاستخدام الواحد.

تعديل ويندوز XP ليستقبل التحديثات الأمنية من مايكروسوفت

الكثير من الناس قد هجر النظام العجوز ويندوز XP لأسباب عديدة منها انه لم يعد متوفر في السوق والأجهزة الجديدة تأتي محلمة بالإصدارات الحديثة من ذلك النظام وكذلك بسبب إيقاف شركة مايكروسوفت الدعم لذلك النظام فلم يعد يستقبل التحديثات الأمنية وكل من لديه اهتمام ولو بسيط بأمن المعلومات يدرك مدى أهمية تلك التحديثات خصوصا لنظام مثل الويندوز.

لكن البعض قد يفضل استخدام XP بدلا من الإصدارات الأحدث لعدة أسباب منها كونه اخف واقل استهلاك لموارد الجهاز خصوصا في حال استخدامه كنظام وهمي (Virtual system) وكذلك كونه نظام قديم قد تلقى الكثير من التحديثات والاختبارات والترقيعات فغالبا سيكون اكثر أمنا واستقرارا من الإصدارات الجديدة والتي ما زالت تحتوي على العديد من المشاكل والثغرات غير المكتشفة وكذلك كونه لا يحتوي على إضافات مايكروسوفت الجديدة والتي تجمع وترسل بعض المعلومات عن المستخدم إلى خوادم الشركة كما في ويندوز 10.

مهما كانت أسباب اختيارك أو قناعتك بنظام XP فهناك طريقة تجعل النظام يستقبل تحديثات أمنية وبشكل رسمي من الشركة، وهذه الطريقة تعتمد على تغيير قيمة في سجلات النظام لتجعله يعتقد أنه نظام XP المخصص للأنظمة المدمجة كما في أجهزة البيع والأجهزة الطبية (Point of Service) إذ أن مايكروسوفت لا زالت تدعم تلك الإصدارة من النظام وذلك بسبب انتشارها في أجهزة كثيرة واستحالة تحديثها لإصدارات جديدة من نظام الويندوز. Continue reading “تعديل ويندوز XP ليستقبل التحديثات الأمنية من مايكروسوفت”

[برمجة اندرويد] تحريك الرسومات في الألعاب

غالبية الألعاب وكذلك بعض التطبيقات تتطلب تحريك صور وشخصيات رسومية خلال الشاشة، تحريك الشخصيات يتم من خلال رسم الشخصية بحالات الحركة المطلوبة (sprite) ثم عرض تلك الرسومات واحدة تلو الأخرى لتعطي إيحاء الحركة كالصورة التالية:
Animation Sprite
وأما تحريك الخلفيات فغالبا يتم من خلال إنشاء صورة خلفية اكبر من حجم مساحة العرض ثم عرض جزء من الصورة وتغيير احداثياتها لتبدو كأنها تتحرك.

يوفر الاندرويد عنصر للصور (ImageView) لكن ذلك مخصص لعرض الصور الثابتة أو التي لا تتطلب تغييرات سريعة ولا يمكن استخدامه للصور المتحركة لأنه بطيء. للتعامل مع الصور المتحركة نحتاج إلى الرسم مباشرة على canvas (سطح الرسم) لكن توجد طريقة تبسط العملية وهي باستخدام عنصر SurfaceView والذي يمكنك من الرسم المباشر على canvas وبطريقة سهلة.
عملية التحريك تحتاج أن تعمل في الخلفية لكي لا تعطل عمل التطبيق (لفهم عمليات الخلفية راجع الشرح السابق). لتنظيم العمل سنجعل النص الخاص بالحركة في كلاس (class) خاص سنسمية AnimGuy:

public class AnimGuy extends SurfaceView implements Runnable {
....
}

Continue reading “[برمجة اندرويد] تحريك الرسومات في الألعاب”

[برمجة اندرويد] تنفيذ العمليات في الخلفية

عند تنفيذ تطبيق الاندرويد يتم إنشاء عملية أساسية تسمى UI Thread وهي المسؤولة في تنفيذ أوامر التطبيق وعرض النتائج على الشاشة وكذلك الاستجابة لعمليات المستخدم مثل الضغط على الأزرار والكتابة …الخ. في التطبيقات البسيطة تكون تلك العملية قادرة على أداء المهمة بشكل جيد لكن توجد حالات كثيرة يحتاج فيها مطور التطبيق إلى إنشاء عمليات إضافية لكون العملية الأساسية UI Thread غير كافية.

لنفرض مثلا أن التطبيق يقوم بتحميل ملف ويعرض نسبة التحميل على الشاشة بشكل مباشر فهذا يعني أننا نحتاج إلى مراقبة حالة الملف وتعديل البيانات المعروضة على الشاشة بشكل مستمر، لو نفذنا هذه الخطوات باستخدام العملية الأساسية فستجد أن التطبيق سيصبح مشغول في حلقة برمجية (loop) لمراقبة عملية تحميل الملف وتعديل بيانات العرض ولن يكون هناك وقت للتعامل مع المستخدم أو بقية أجزاء التطبيق بمعنى أن التطبيق سيكون في حالة عدم استجابة إلى أن يكتمل الملف وتنتهي الحلقة البرمجية. وستلاحظ كذلك أن حالة تحميل الملف الظاهرة على الشاشة لن تتحدث وستكون صفر عند البداية وستبقى كذلك إلى أن يكتم التحميل وستقفز فجأة إلى 100% والسبب أن العملية الأساسية كما ذكرنا مشغولة بعملية التحميل ولا تستطيع تحديث شاشة التطبيق ليرى المستخدم نسبة تحميل الملف. نفس المشكلة لو كان البرنامج عبارة عن ساعة زمنية أو يقوم بتحريك رسومات أو لعبة.

الحل سهل، وهو بإنشاء عملية أخرى تعمل في الخلفية تقوم هي بمتابعة عملية تحميل الملف وترسل تحديثات عن حالة التحميل إلى العملية الأساسية وهذه العملية تسمى AsyncTask وتعني العملية غير المتزامنة لأنها تعمل بشكل مستقل عن العملية الأساسية. Continue reading “[برمجة اندرويد] تنفيذ العمليات في الخلفية”

كيف تتعامل مع برنامج ادارة الاصدارات git

في هذا الموضوع سأحاول أن اشرح برنامج git بشكل موجز، البرنامج ضخم وذو إمكانات كثيرة اجهل جلها لكن تعلمت بعض الأساسيات التي أود مشاركتكم بها. البرنامج كان فكرة وتطوير “لينوس تورفالدز” مخترع نواة اللينكس حيث كانت الأدوات البديلة المفتوحة  وقتها لا تفي بمتطلبات مشروع ضخم مثل نواة اللينكس وكانو يستخدمون تطبيق مغلق وغير مجاني.

في البداية أريد أن أوضح أن git ليس github و github عبارة عن تطبيق ويب يعتمد على git ويوفر مساحة تخزينية للمشاريع. وتستطيع عمل مشاريعك وادارتها على خادمك الخاص او خادم الشركة باستخدام git دون الحاجة لgithub.

توجد عدد من الواجهات الرسومية للتعامل مع git إما تطبيقات مستقلة أو مدمجة في تطبيقات البرمجة IDE لكن من تجربتي لا يوجد تطبيق رسومي شامل وتحتاج بين الفينة والأخري لاستخدام الأمر git من سطر الأوامر لتنفيذ مهام معينة.

Continue reading “كيف تتعامل مع برنامج ادارة الاصدارات git”

Nexus 6P Headset Volume down button fix

Nexus 4 owners, and I am one of them, were disappointed to find out that it only support 1 button headset control, so no buttons for Vol+ and Vol-. When I bought the Nexus 6P I was hoping it will have support for 3 buttons control. After I got the phone I tested it with my Samsung headset, the play/pause button and the Volume Up button work, however, Volume Down didn’t!!!

I was hoping it is a faulty headset since that I can replace easily, but if it was a design mistake in the Nexus then it might be a problem forever. Luckily and after a quick Google search I found a post on reddit from someone asking if the Nexus 6P has support for 3 buttons headset. The answer was yes, so that is a good news, but one of the replies was from a reddit user “buddhra” who was having a similar problem as mine and did a further test to find out that the Nexus 6P acceptable resistance range for the Vol- doesn’t stretch to the maximum range which the Android specs allows.
Here is a snapshot for part of the post:

Reddit Nexus 6P 3 button headset support problemSo I tested mine and found the resistance of the third button (Vol-) to be 630 ohms, which is within the Android specs but seems out of what the Nexus 6P can recognize.  Not sure if it is a software or a hardware problem in the Nexus 6P which I won’t be able to fix easily, but I know that I can instead fix the headset itself to give the readings that the Nexus 6P expects.

So I opened up the headset control, it is very small and was glued together, but using a thin blade i managed to open it up:

Opening up Samsung headset controlZooming into the circuit board and tracing the PCB wires I figured how the resistors were connected and managed to replace one of the resistors (R3 = 356 ohms) with one of a smaller value (200 ohms) and it now works. (The resistors used in the board are size 402, however, I had one with size 603 which is a little bigger but there was enough space to fit it without any problems):

Samsung Headset Fix for Nexus 6PAll Android headset controls follow a similar way to provide the needed resistance, so your control board might differ but it should be similar.

Let your Arduino get enough sleep

The sensor I am building is based on an Arduino Pro Mini (Atmega328p) with ESP8266 wifi module and a sensor. It will run on batteries with a sample rate of 1 sample per hour. With such low sampling rate it is very obvious that I need to make my microcontroller and the wifi module sleep to reduce power consumption. To wake up the Atmega328p MCU from power down sleep I have to use either the Watchdog Timer (WDT) or an external interrupt. The problem with the WDT on that MCU is that the maximum sleep time it supports is 8 seconds. And to make it sleep longer you need to put the sleep statement in a loop that puts it back into sleep until it reaches a certain count value then resume working.

This is an example of such solution:

for (int i = 1; i <= count ; i++) {
    sleep_cpu ();
}

However, in 1 hour of needed sleep the MCU will wake up 450 times!

Continue reading “Let your Arduino get enough sleep”

Arduino resets when disabling Watchdog Timer!

While working on a small arduino project that will run on batteries I needed to enable deep sleep mode to reduce the energy consumption when not needed until the arduino is awaken by an external interrupt.  However, I am also using the Watchdog Timer (WDT) to make sure the system will not hang up or get into in infinite loop due to some bug or unknown situation. The maximum time that the WDT on the Atmega328p supports is 8 seconds, and if 8 seconds has passed before calling wdt_reset() the WDT will reset the microcontroller, however, my boards will sleep for way longer than 8 seconds so I have to disable the WDT before going to sleep and enable it back once waken up.

Disabling WDT should be an easy thing to do by simply calling wdt_disable(), however, calling this statement also caused the atmega328 to reset!

After looking into the content of the header file “avr/wdt.h” it seems like the Arduino IDE or AVR compiler (not sure who is responsible) is not defining the correct board/chip even though I set the correct board & processor in the Arduino IDE. And the way I solved the issue was to define the correct microcontroller before including the wdt.h:

#define __AVR_ATmega328P__
#include <avr/wdt.h>

Now the code works as intended without causing a reset.

Add Wireless charging to your car phone holder

Being a lucky Android user with the luxury of Wireless charging  I thought about adding it to my car since I use it at home and love it. I have seen some charging pads for cars but that means you have to place your phone in a way which makes it unusable while I want it to charge while using the phone for navigation so the best place was the phone holder. So i bought one that allows me to place the phone near an A/C vent (so it will cool down the phone during long road trip when charging and using the navigation at the same time), I also bought a bare board Qi wireless charging board from eBay (~$3.6), you can also buy the cheaper round charging pads and take the internal parts, but the bare board uses better components which I though worth the extra dollar.

Phone holder and Qi wireless charging board Continue reading “Add Wireless charging to your car phone holder”

تفعيل خاصية حماية الخصوصية في فيرفوكس

تقدم شركة موزيلا في متصفحها فيرفوكس للحاسوب والاندرويد خاصية جديدة بحيث تقوم بحجب شركات التتبع، إما تتبع بغرض الإعلانات او تتبع للإحصاء، و بالإضافة لحماية خصوصيتك من تلك الشركات فان التصفح سيكون اسرع كذلك والسبب أن روابط التتبع تقوم بتحميل ملفات كبيرة الحجم وصور إعلانات ليس لها علاقة بمحتوى الموقع المُزار.

خطوات التفعيل سهلة إذ عليك زيارة صفحة إعدادات فيرفوكس المتقدمة وذلك عن طريق كتابة about:config في حقل عناوين الإنترنت والضغط على مفتاح الإدخال (قد تحتاج إلى ضغط زر “I’ll be careful, I promise!” إذا ظهرت صفحة التنبيه).

في صفحة الإعدادات ستجد شريط بحث في الأعلى يساعد على إيجاد الإعدادات بسهولة. فقم بكتابة “trackingprotection” في ذلك الشريط للبحث عن الإعدادات المتعلقة بذلك الترميز ثم قم بتفعيلها كما هو موجود في الصورة التالية للحواسيب:

Firefox Tracking Protectionوالصورة التالية للاندرويد (حاليا متوفرة في Firefox Beta):

Firefox Beta Tracking Protection