الـ Requirements بتاعتهم ان الداتا دي متتخزنش في الهاردديسك الخاص باليوزر وتكون مرتبطة بالسيشن يعني لو اليوزر قفل المتصفح او الـ Browser Tab الداتا تختفي وفي نفس الوقت يحافظوا عليها لما اليوزر يعمل ريلود.

أول خيار كان قدامهم انهم يخزنوا الـ Sensitive Data دي في الميموري ومتتخزنش نهائي في الـBrowser Storage لكن المشكلة اللي هتواجهم ان بمجرد ما اليوزر يعمل ريلود الداتا دي هتختفي.

الخيار التاني هو الـ sessionStorage بما أن الداتا بتفضل موجودة فيه لو اليوزر عمل ريلود وكمان وقت ما اليوزر يقفل المتصفح او الـ Tab الداتا هتختفي لكن المشكلة ان معظم المتصفحات بتخزن الداتا الموجوده في الـ sessionStorage في الهارديسك بتاع اليوزر عشان الـ session recovery feature. وهم مش عايزين الداتا دي تتخزن في الهاردديسك.

الخيار التالت هو Property اسمها Window.name بتسمحلك انك تخزن الداتا فيها وبتفضل موجودة لما اليوزر يعمل ريلود ومبتتكتبش على الهارديسك، وكمان لو اليوزر قفل الـ Browser Tab بتتسمح، لكن مشكلتها ان في ناس بتستخدمها في الـ Cross-domain communication وبالتالي الـ Websites التانية تقدر تقرأ القيمة اللي فيها، فبردو مينفعش يخزنوا فيها الداتا بشكل كامل، طيب ايه الحل؟

الحل

الحل انهم هيعملوا Two tricks، الاولى انهم هيسيبوا الداتا في الميموري ومش هيخزنوها في الـBrowser الا قبل ما الميموري تتمسح، عند الـ Page unloads.

التركايه التانية انهم هيفصلوا الداتا دي لجزئين بإستخدم الـ XOR، اولا هيعملوا Generate لـ Random Value وبعدين هيعملوا XOR ليها مع الـ Private data زي كده:

X = Private ^ Random
Y = Random

الـ X هتتخزن في الـ sessionStorage ، والـ Y هتتخزن في الـ Window.name!
فهنا لو افترضنا ان في حد عنده Access على الهارديسك فهو هيقدر يقرأ الحاجه المتخزنة في الـ sessionStorage اللي في الحالة دي X لكن مش هيقدر يقرأ الحاجه المتخزنة في الـ Window.name وبالتالي مش هيقدر يوصل لحاجه، الحاجه التانية ان الـ Websites التانية تقدر تقرأ قيمة الـ Y وده بردو مش هيفرق معانا لانها اولا Random ثانيا ان اي موقع تاني مش هيقدر يوصل للـ sessionStorage بتاعتنا عشان الـ Same-origin policy!

النتيجة

بعد ما اليوزر يعمل ريلود تقدر تعمل X ^ Y فتوصل لقيمة الـ Private data ودي حاجه معروفة في الـ XOR:

X ^ Y = Private ^ Random ^ Random

الـ Random هيكنسلوا بعض فهيتبقالك الـ Private Data.
تقدر تقرأ شرحهم والـ Implementation للكلام ده كله من الريبو بتاعتهم من هنا:

github.com/ProtonMail