الرسائل التي لا تُخزَّن
الرسائل التي لا تُخزَّن (OTR)
الوصف
OTR (Off-The-Record Messaging) هو بروتوكول لتأمين اتّصالات المراسلة الفوريّة بين
الأشخاص borisov:otr. وهو مقصود أن يكون المكافئ الإلكترونيّ لمحادثةٍ خاصّة في
الواقع الملموس. فهو يشفّر الرسائل، ويمنع المتنصّتين من قراءتها. كما أنّه يوثّق
هوية كلّ طرفٍ للآخر، فيعرف كلٌّ منهما مع من يتحدث. ورغم أنّه يوثّق هوية الأطراف،
فهو مصمَّم ليكون قابلًا للإنكار: فيمكن للمشاركين أن ينكروا لاحقًا أمام أطراف
ثالثة كلّ ما قاله بعضهم لبعض. وهو مصمَّم أيضًا ليكون ذو سرّية أماميّة تامّة
(perfect forward secrecy): فحتى انكشاف زوج مفاتيح عامّ طويل الأمد لا يُفشي أيّ
محادثة سابقة.
وتختلف خاصيّتا الإنكار والسرّية الأماميّة التامّة اختلافًا كبيرًا عن خاصيّتي
أنظمة أخرى مثل OpenPGP. فـ OpenPGP يضمن عمدًا خاصّية عدم الإنكار. وهذه خاصّية
رائعة إن كنت توقّع توقيع حزم برمجيّة، أو تحدّث في قوائم بريد، أو توقّع فواتير
تجاريّة؛ لكنّ مؤلّفي OTR يجادلون بأنّ هذه ليست خصائص مرغوبة في المكافئ
الإلكترونيّ لمحادثات بين شخصين. فضلًا عن ذلك، فإنّ النموذج الساكن (static)
للاتصال في OpenPGP يجعل إعادة تفاوض المفاتيح المستمرةّ التي تتيح السرّية الأماميّة
التامّة لـ OTR مستحيلة.
ويُضبط OTR عادةً على نحو opportunistic، أي أنّه سيحاول تأمين أيّ اتصال بين طرفَين
إذا كان كلاهما يفهم البروتوكول، دون أن يتدخّل في الاتصال مع طرفٍ لا يفهمه. وهو
البروتوكول مدعوم في عملاء مراسلة فوريّة عديدة إمّا مباشرةً أو عبر إضافة. ولأنّه
يعمل فوق الرسائل الفوريّة، فيمكن استعماله عبر بروتوكولات مراسلة فوريّة عديدّة
مختلفة.
ويمكن للطرف أن يُشير إلى رغبته في التحدث عبر OTR برسالة صريحة، تُسمّى رسالة
استعلام OTR. أمّا إذا كان الطرف راضيًا بالتحدث عبر OTR دون أن يشترطه، فيمكنه
اختياريًّا أن يضيف تلك المعلومات بصورة غير مرئية إلى رسالة بنصّها صريح. ويحدث
ذلك عبر نظامّ ماكر من وسوم المسافات: إذ تُستعمل كمّية من المسافات، مثل محارف
الفراغ ومحرّفات الجدولة، لترميز تلك المعلومات. ويمكن لعميل قادر على OTR أن
يفسّر ذلك الوسم ويبدأ محادثة OTR؛ أمّا العميل غير القادر على OTR فيكتفي
بعرض مسافات إضافيّة.
ويستعمل OTR كثيرًا من الأساسيات التي رأيناها حتى الآن:
- التشفير بمفتاح متماثل (AES في وضع CTR)
شفرة مصادقة الرسائل <message authentication code>(HMAC مع SHA-1)- تبادل المفاتيح Diffie-Hellman
ويستعمل OTR أيضًا آلية أخرى تُسمّى SMP، للتحقّق ممّا إذا كان الطرفان قد
وصلا إلى السرّ المشترك نفسه.
تبادل المفاتيح
في OTR، يعتمد تبادل المفاتيح المصادَق عليه (AKE) إلى حدٍّ بعيد على تبادل
المفاتيح Diffie-Hellman، مع توسيعه بعدد كبير من الفحوص الإضافيّة المترابطة.
ويستعمل تبادل Diffie-Hellman نفسه عددًا أوّليًّا ثابتًا بطول 1536 بتًّا مع مولّد
ثابت g.
ولنفترض أنّ مشاركَين، يُسمّيان Alice وBob، يريدان التحدّث ويريدان تبادل بيانات
حسّاسة بينهما. ويملك كلٌّ من Alice وBob زوج مفاتيح مصادقة DSA طويل الأمد،
سنسميهما على التوالي (p_A, s_A) و(p_B, s_B).
كما يعتمد البروتوكول على عددٍ من الأساسيات الأخرى:
- شيفرة كتل بطول 128 بتًّا. وفي
OTRتكون دائمًا AES. وسنسمّي في هذا القسم تشفير شيفرة الكتل وفكّ تشفيرهاEوDعلى التوالي. - دالة تجزئة،
H. وفيOTRتكون SHA1. شفرة مصادقة رسائل(message authentication code)،M. وفيOTRتكون HMAC-SHA1.- دالة توقيع،
S.
رسالة الالتزام
في البداية يكون Alice وBob في حالة بروتوكولية ينتظران فيها أن يبدأ الطرف الآخر
اتصال OTR، ويعلن كلٌّ منهما قدرته على التحدّث عبر OTR.
ولنفترض أنّ Bob يقرّر أن يبدأ محادثة OTR مع Alice. فيرسل عميله رسالة التزام
OTR، ثمّ ينتقل إلى حالة ينتظر فيها ردًّا من عميل Alice.
ولإرسال رسالة التزام، يختار العميل قيمة r عشوائيّة بطول 128 بتًّا وسرًّا
Diffie-Hellman عشوائيًّا x بطول 320 بتًّا أو أكثر. ثمّ يرسل E(r, g^x) وH(g^x)
إلى الطرف الآخر.
رسالة المفتاح
تلقّى عميل Alice إعلان عميل Bob بالبدء في جلسة OTR. فيردّ عميلها برسالة
مفتاح، تتضمّن إنشاء زوج مفاتيح Diffie-Hellman جديد. فهي تختار سرًّا
Diffie-Hellman عشوائيًّا y بطول 320 بتًّا أو أكثر، وترسل g^y إلى Bob.
رسالة كشف التوقيع
الآن، بعد أن أرسلت Alice مفتاح Diffie-Hellman العامّ الخاصّ بها، يستطيع Bob أن يُتمّ دوره من بروتوكول Diffie-Hellman. ولا تستطيع Alice أن تتابع بعد، لأنّها لم ترَ بعد المفتاح العامّ الخاصّ بـ Bob.
ولما ناقشنا Diffie-Hellman، لاحظنا أنّه لا يوثّق هوية الطرف. فـ Bob يستطيع حساب سرّ، لكنّه لا يعرف مع من يتحدث. وكما في TLS وفي الأنظمة الأخرى المستعملة لـ Diffie-Hellman، تُحلّ هذه المشكلة بتوثيق تبادل المفاتيح.
وبعد أن يتحقّق Bob من صحّة القيمة العامّة لمفتاح Alice، يحسب السرّ المشترك
s = (g^y)^x. وباستعمال دالة اشتقاق مفاتيح، يشتقّ عدّة مفاتيح من s: مفتاحي
AES هما c, c^\prime، وأربعة مفاتيح MAC هي m_1, m_1^\prime, m_2, m_2^\prime.
ويختار Bob رقم تعريف i_B لزوج مفاتيح Diffie-Hellman الحالي الخاصّ به
(x, g^x). وسيكون لهذا أهمّية بمجرّد أن يولّد Alice وBob زوجَي مفاتيح جديدَين،
وهما ما سيحدث لاحقًا في بروتوكول OTR.
ويحسب Bob ما يلي:
M_B = M_{m_1}(g^x, g^y, p_B, i_B)
X_B = (p_B, i_B, S(p_B, M_B))
ثمّ يرسل إلى Alice ما يلي: r, E_c(X_B), M_{m_2}(E_c(X_B)).
رسالة التوقيع
صار بإمكان Alice الآن أن تؤكّد أنّها تتحدث إلى Bob مباشرةً، لأنّ Bob وقّع
مُصادق التبادل M_B بمفتاح DSA طويل الأمد خاصّ به.
وصار بإمكان Alice أيضًا أن تحسب السرّ المشترك: فقد أرسل لها Bob قيمة r، التي
استُعملت من قبل لتشفير مفتاح Diffie-Hellman العامّ الخاصّ بـ Bob. ثمّ تحسب هي
بنفسها H(g^x) لتقارنها بما أرسله Bob. وبإتمام جانبها من تبادل Diffie-Hellman
(s = (g^x)^y)، تشتقّ المفاتيح نفسها:
c, c^\prime, m_1, m_1^\prime, m_2, m_2^\prime. وباستعمال m_2 تستطيع
التحقّق من M_{m_2}(E_c(X_B)). ومتى تحقّقت من تلك الرسالة، أمكنها فكّ تشفيرها
بأمان باستعمال c التي حسبتها.
ومن ثمّ تستطيع أيضًا أن تحسب M_B = M_{m_1}(g^x, g^y, p_B, i_B)، وتتحقّق من
أنّها مطابقة لما أرسله Bob. وبالتحقّق من الجزء الموقَّع S(p_B, M_B) مقابل المفتاح
العامّ الخاصّ بـ Bob، تكون قد ربطت التفاعل الجاري ربطًا قاطعًا بمفتاح مصادقة Bob
طويل الأمد.
ثمّ تحسب القيم نفسها التي حسبها Bob لربط مفتاحه طويل الأمد بالمصافحة قصيرة
الأمد، بحيث يتمكّن Bob أيضًا من توثيقها. فهي تختار رقم تعريف i_A لزوج مفاتيح
DH الحالي الخاصّ بها (y, g^y)، وتحسب M_A = M_{m_1^\prime}(g^y, g^x, p_A, i_A)
وX_A = p_A, i_A, S(p_A, M_A). وأخيرًا، ترسل إلى Bob ما يلي:
E_{c^\prime}(X_A), M_{m_2^\prime}(E_c(X_B)).
توثيق Alice
صار بإمكان Bob الآن أن يوثّق Alice أيضًا، بمقدّم الخطوات نفسها بالتبادل. أوّلًا، يتحقّق من M_{m_2^\prime}(E_c(X_B)). ويتيح له ذلك التأكّد من أنّ Alice
رأيت X_B نفسها التي أرسلها.
ومتى فكّ تشفير E_{c^\prime}(X_A)، صار لديه X_A، وهي معلومات المفتاح العامّ
طويل الأمد الخاصّة بـ Alice. ومن ثمّ يستطيع حساب
M_A = M_{m_1^\prime}(g^y, g^x, p_A, i_A) ليقارنها بالنسخة التي أرسلتها Alice.
وأخيرًا، يتحقّق من S(p_A, M_A) بالمفتاح العامّ الخاصّ بـ Alice.
ماذا أنجزنا؟
إذا نجحت كلّ الفحوص، فقد أتمّ Alice وBob تبادل Diffie-Hellman مصادَقًا عليه، ولديهما سرٌّ مشترك لا يعرفه إلا هما معًا.
والآن بعد أن رأيت جانبَي المصافحة المصادَق عليها، تستطيع أن ترى لماذا تُشتقّ
مفاتيح كثيرة مختلفة من سرّ Diffie-Hellman. فالمفاتيح الموسومة بعلامة أوليّة
(\prime) مخصّصة للرسائل الصادرة من الطرف الثاني (الذي يردّ على الإعلان، وهو
Alice في حالتنا)؛ أمّا المفاتيح غير الموسومة فهي مخصّصة للطرف البادئ (Bob في
حالتنا).
تبادل البيانات
TODO: اشرح (https://otr.cypherpunks.ca/Protocol-v3-4.0.0.html)، #33