Local Database

يتوقّع الإصدار 5 من ميزة "التصفح الآمن من Google" أن يحافظ العميل على قاعدة بيانات محلية، إلا عندما يختار العميل وضع "الوقت الفعلي بدون تخزين". يُرجى العِلم أنّ تنسيق هذه قاعدة البيانات المحلية وتخزينها يعتمدان على العميل. يمكن اعتبار محتوى هذه قاعدة البيانات المحلية من الناحية المفاهيمية كملف مجلد يحتوي على قوائم مختلفة، ومحتوى هذه الملفات هو تجزئات SHA256 أو بادئاتها المقابلة التي تكون بادئة التجزئة المكونة من أربعة بايت هي طول التجزئة الأكثر استخدامًا.

القوائم المتاحة

يتم تحديد القوائم من خلال أسمائها الفريدة التي تتبع اصطلاح تسمية يتضمّن الاسم إضافة تشير إلى طول التجزئة التي تتوقّع ظهورها في القائمة. ستكون قوائم التجزئة التي تتضمّن نوع التهديد نفسه ولكن بطول تجزئة مختلف قائمة تحمل اسمًا منفصلاً ومُحدَّدة بلاحقة تشير إلى طول التجزئة.

تتوفّر القوائم التالية للاستخدام مع طرق قائمة التجزئة.

اسم القائمة التعداد ThreatType المقابل في الإصدار 4 الوصف
gc-32b بدون هذه القائمة هي قائمة "الذاكرة المؤقتة الشاملة". وهي قائمة خاصة لا تُستخدَم إلا في وضع "الوقت الفعلي".
se-4b SOCIAL_ENGINEERING تحتوي هذه القائمة على تهديدات من نوع التهديد SOCIAL_ENGINEERING.
mw-4b MALWARE تحتوي هذه القائمة على تهديدات من نوع تهديدات البرامج الضارة لمنصّات أجهزة الكمبيوتر المكتبي.
uws-4b UNWANTED_SOFTWARE تحتوي هذه القائمة على تهديدات من نوع التهديد UNWANTED_SOFTWARE لمنصّات أجهزة الكمبيوتر المكتبي.
uwsa-4b UNWANTED_SOFTWARE تحتوي هذه القائمة على تهديدات من نوع التهديد UNWANTED_SOFTWARE لمنصّات Android.
pha-4b POTENTIALLY_HARMFUL_APPLICATION تحتوي هذه القائمة على تهديدات من نوع POTENTIALLY_HARMFUL_APPLICATION لأنظمة Android الأساسية.

يمكن أن تتوفّر قوائم إضافية في تاريخ لاحق، وفي ذلك الوقت سيتم توسيع الجدول أعلاه، وستعرض النتائج من طريقة hashList.list نتيجة مشابهة مع أحدث القوائم.

تعديلات قاعدة البيانات

سيستدعي العميل بانتظام طريقة hashList.get أو طريقة hashLists.batchGet لتعديل قاعدة البيانات. بما أنّ العميل العادي سيريد تعديل قوائم متعددة في المرة الواحدة، ننصحك باستخدام طريقة hashLists.batchGet.

ولن تتم إعادة تسمية أسماء القوائم أبدًا. بالإضافة إلى ذلك، لن تتم إزالة أي قائمة بعد ظهورها (إذا لم تعُد القائمة مفيدة، ستصبح فارغة ولكن ستظل موجودة). لذلك، من المناسب تضمين هذه الأسماء في رمز العميل في "التصفّح الآمن من Google".

تتيح كلّ من طريقة hashList.get وطريقة hashLists.batchGet إجراء تعديلات تدريجية. ويؤدي استخدام التحديثات المتزايدة إلى توفير النطاق الترددي وتحسين الأداء. تعمل التعديلات المتزايدة من خلال تقديم فرق بين إصدار القائمة لدى العميل وأحدث إصدار منها. (إذا تم نشر عميل حديثًا ولم يكن لديه أي إصدارات متوفّرة، يتوفّر تحديث كامل). يحتوي التحديث المتزايد على مؤشرات الإزالة والإضافات. من المتوقّع أن يزيل العميل أولاً الإدخالات في الفهارس المحدّدة من قاعدة بياناته المحلية، ثم يطبّق الإضافات.

أخيرًا، لمنع التلف، يجب أن يتحقّق العميل من البيانات المخزّنة مقارنةً بقيمة التجزئة المقدَّمة من الخادم. عندما لا يتطابق الملخّص، على العميل إجراء تحديث كامل.

فك ترميز محتوى القائمة

فك ترميز قيم التجزئة وبادئات قيم التجزئة

يتم إرسال جميع القوائم باستخدام ترميز خاص لتقليل حجمها. يعمل هذا الترميز من خلال التعرّف على أنّ قوائم "التصفح الآمن من Google" تحتوي، من الناحية المفهومية، على مجموعة من التجزئات أو بادئات التجزئة، والتي لا يمكن تمييزها إحصائيًا عن الأعداد الصحيحة العشوائية. إذا أردنا ترتيب هذه الأعداد الصحيحة وأخذ الفرق المجاور لها، من المتوقّع أن يكون هذا الفرق المجاور "صغيرًا" إلى حدّ ما. يستغل ترميز Golomb-Rice هذا الصغر.

لنفترض أنّه يجب نقل ثلاثة تعبيرات بادئة لمسار اللاحقة للمضيف، وهي a.example.com/ وb.example.com/ وy.example.com/، باستخدام بادئات تجزئة من 4 بايت. لنفترض أيضًا أنّ مَعلمة Rice، التي يُشار إليها بالرمز k، تم اختيارها على النحو التالي:

  1. سيبدأ الخادم بحساب التجزئة الكاملة لهذه السلاسل، وهي على التوالي:
291bc5421f1cd54d99afcc55d166e2b9fe42447025895bf09dd41b2110a687dc  a.example.com/
1d32c5084a360e58f1b87109637a6810acad97a861a7769e8f1841410d2a960c  b.example.com/
f7a502e56e8b01c6dc242b35122683c9d25d07fb1f532d9853eb0ef3ff334f03  y.example.com/

يُنشئ الخادم بعد ذلك بادئات تجزئة بسعة 4 بايت لكلٍّ ممّا سبق، وهي أوّل 4 بايت من التجزئة الكاملة التي تبلغ 32 بايت، ويتم تفسيرها على أنّها أعداد صحيحة بسعة 32 بت بترتيب البتات الكبير. يشير تنسيق Big endian إلى حقيقة أنّ البايت الأول من التجزئة الكاملة يصبح البايت الأكثر أهمية من الرقم الصحيح 32 بت. تؤدي هذه الخطوة إلى الحصول على الأعداد الصحيحة 0x291bc542 و0x1d32c508 و0xf7a502e5.

يجب أن يُجري الخادم ترتيبًا أبجديًا لهذه البادئات الثلاث للتشفير (ما يعادل الترتيب الرقمي بالتنسيق الكبير والصغير)، وتكون نتيجة الترتيب هي 0x1d32c508 و0x291bc542 و0xf7a502e5. يتم تخزين بادئة التجزئة الأولى بدون تغيير في حقل first_value.

بعد ذلك، يحتسِب الخادم الفرقَين المجاورَين، وهما 0xbe9003a و0xce893da3 على التوالي. بما أنّه تم اختيار k‏= 30، يقسم الخادم هذين الرقمين إلى جزءين، جزء حاصل القسمة وجزء المتبقي، بطول 2 و30 بت على التوالي. بالنسبة إلى الرقم الأول، يكون جزء القسمة صفرًا والباقي هو 0xbe9003a. بالنسبة إلى الرقم الثاني، يكون جزء القسمة 3 لأنّ أهم وحدتَي بت هما 11 في النظام الثنائي والباقي هو 0xe893da3. بالنسبة إلى حاصل القسمة المحدَّد q، يتم ترميزه إلى (1 << q) - 1 باستخدام 1 + q بت بالضبط، ويتم ترميز المتبقي مباشرةً باستخدام k بت. يتم ترميز جزء القسمة من الرقم الأول على النحو التالي 0، وجزء المتبقي بالتنسيق الثنائي 001011111010010000000000111010. ويتم ترميز جزء القسمة من الرقم الثاني على النحو التالي 0111، وجزء المتبقي هو 001110100010010011110110100011.

عند تحويل هذه الأرقام إلى سلسلة بايت، يتم استخدام تنسيق little endian. من الناحية النظرية، قد يكون من الأسهل تخيل سلسلة بتات طويلة يتم إنشاؤها بدءًا من البتات الأقل أهمية: نأخذ جزء القسمة من الرقم الأول ونضيف إليه الجزء المتبقي من الرقم الأول، ثم نضيف الجزء المتبقي من الرقم الثاني. من المفترض أن يؤدّي ذلك إلى ظهور العدد الكبير التالي (تمّت إضافة فواصل أسطر وتعليقات للوضوح):

001110100010010011110110100011 # Second number, remainder part
0111 # Second number, quotient part
001011111010010000000000111010 # First number, remainder part
0 # First number, quotient part

إذا كتبت هذا الرمز في سطر واحد، سيظهر على النحو التالي:

00111010001001001111011010001101110010111110100100000000001110100

من الواضح أنّ هذا العدد يتجاوز بكثير الـ 8 بتات المتوفّرة في بايت واحد. بعد ذلك، يأخذ ترميز little endian الثماني بتات الأقل أهمية في هذا الرقم ويعرضها كأول بايت وهو 01110100. للتوضيح، يمكننا تجميع سلسلة البتات أعلاه في مجموعات من ثمانية بتات بدءًا من البتات الأقل أهمية:

0 01110100 01001001 11101101 00011011 10010111 11010010 00000000 01110100

بعد ذلك، يأخذ ترميز little endian كل بايتة من اليمين ويضع ذلك في سلسلة بايتات:

01110100
00000000
11010010
10010111
00011011
11101101
01001001
01110100
00000000

يمكن ملاحظة أنّه بما أنّنا نضيف بشكل مفاهيمي أجزاء جديدة إلى الرقم الكبير على اليسار (أي إضافة المزيد من الوحدات المهمّة) ولكنّنا نُشفّر من اليمين (أي الوحدات الأقل أهمية)، يمكن تنفيذ التشفير وفك التشفير بشكل تدريجي.

ويؤدي ذلك في النهاية إلى

additions_four_bytes {
  first_value: 489866504
  rice_parameter: 30
  entries_count: 2
  encoded_data: "t\000\322\227\033\355It\000"
}

يتّبع العميل الخطوات أعلاه بالترتيب العكسي لفك ترميز بادئات التجزئة.

ترميز مؤشرات الإزالة

يتم ترميز مؤشرات الإزالة باستخدام التقنية نفسها المذكورة أعلاه باستخدام أعداد صحيحة 32 بت.

معدّل التحديثات

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