التوثيق
/

مفتاح ترميز مصفوفة البايت كود

إخراج مفتاح ترميز مصفوفة البايت كود إلى الخارج

Pro

زوّد مفتاح تشفير البايت كود الخاص بالآلة الافتراضية بنفسك عبر vmBytecodeArrayEncodingKey وأعِده وقت التشغيل من خلال دالة جلب المفتاح - يبقى خارج الحزمة، أو يُقرأ من تخزين العميل، أو يُجلب من الخادم الخلفي.

ما الذي تفعله هذه الخيارات

يقوم vmBytecodeArrayEncoding بتشفير مصفوفة البايت كود الخاصة بالآلة الافتراضية حتى لا تظهر في المخرجات كنص صريح. افتراضيًا، يُشتق مفتاح التشفير من البيئة ويُعاد بناؤه على جهة العميل، لذا لا تتعامل معه أبدًا. هذا مريح، لكن مادة المفتاح لا تزال موجودة داخل الحزمة.

يتيح لك خياران إخراج المفتاح من الحزمة والتحكم به بنفسك:

  • vmBytecodeArrayEncodingKey - المفتاح الذي تزوّده وقت الترجمة. عند تعيينه، يُستخدم بدلًا من المفتاح الافتراضي المشتق من البيئة، ولا يُضمَّن في المخرجات المشوَّشة.
  • vmBytecodeArrayEncodingKeyGetter - تعبير JavaScript يُرجع المفتاح نفسه وقت التشغيل. يُضمَّن حرفيًا ويُقيَّم في المتصفح عند تحميل الكود المشوَّش.

الهدف هو الفصل: بما أن المفتاح ليس ضمن الكود، فإن الفحص الساكن البحت للحزمة لا يمكنه استعادته. لا يزال يجب أن يكون حاضرًا وقت التشغيل حتى يعمل الكود، لذا فهو ليس سريًا حقًا - لكنك تقرّر من أين يأتي ومن يمكنه رؤيته.

هذان الخياران يشكّلان زوجًا. إن استخدام vmBytecodeArrayEncodingKey بدون دالة جلب يترك الكود المشوَّش بلا وسيلة للحصول على المفتاح وقت التشغيل، ودالة جلب بدون مفتاح مطابق مُعطى وقت الترجمة لا شيء لديها لتتوافق معه. عيّن كليهما معًا، إلى جانب vmBytecodeArrayEncoding: true.

كيف يتّحد المفتاحان

لا يُستخدم مفتاحك بمفرده أبدًا - فعلى كلا الجانبين يُمزج بمفتاح داخلي يتحكم به المشوِّش:

  • وقت الترجمة. يُدمج vmBytecodeArrayEncodingKey مع مفتاح داخلي يشتقّه المشوِّش، وتُرمَّز مصفوفة البايت كود بالمفتاح الممزوج الناتج.
  • وقت التشغيل. تُدمج القيمة التي تُرجعها vmBytecodeArrayEncodingKeyGetter مع المفتاح الداخلي نفسه، المُعاد بناؤه على جهة العميل من عوامل تشغيل مختلفة، لفك ترميز البايت كود.

بما أن كلا الجانبين يمزجان مفتاحك مع المفتاح الداخلي، يجب أن تُرجع دالة الجلب السلسلة النصية نفسها تمامًا التي مررتها إلى vmBytecodeArrayEncodingKey. لا يكفي أي جزء بمفرده: مفتاحك بدون المفتاح الداخلي لا يمكنه فك ترميز البايت كود، والمفتاح الداخلي عديم الفائدة بدون مفتاحك - ولهذا فإن التحكم بمن يتلقى مفتاحك هو ما يحمي الكود فعليًا.

تزويد المفتاح وقت التشغيل

افتراضيًا، تكون دالة الجلب متزامنة: يجب أن يُرجع التعبير المفتاح فورًا عند تحميل الكود المشوَّش. اقرأه من أي مصدر موجود بالفعل على جهة العميل - ملف تعريف ارتباط، أو localStorage، أو متغير عام، أو عنصر DOM محقون من الخادم.

JavaScript

يجب أن يكون المفتاح موجودًا قبل تشغيل الكود المشوَّش:

JavaScript

تعمل المصادر المتزامنة الأخرى بالطريقة نفسها - اختر أيًا منها يملؤه تطبيقك بالفعل:

JavaScript

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

جلب المفتاح من الخادم الخلفي (غير متزامن)

يتطلب vmAsyncExecutor · v7.3.0+

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

JavaScript

دالة الجلب التي تُرجع Promise تتطلب vmAsyncExecutor. لا يمكن التحقق من ذلك وقت البناء، لذا فإن دالة جلب تُرجع Promise مع تعطيل vmAsyncExecutor تفشل وقت التشغيل - إذ يتلقى فاكّ الترميز كائن Promise بدلًا من سلسلة المفتاح النصية.

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

JavaScript

عندما لا يتطابق المفتاح

لا يعمل الكود المشوَّش إلا عندما تُرجع دالة الجلب تمامًا المفتاح نفسه المستخدَم أثناء التشويش. إذا اختلف المفتاحان

  • أو أرجعت دالة الجلب undefined أو null أو سلسلة فارغة - فإن فك التشفير يُنتج تدفّق مفاتيح خاطئًا ويفشل الكود وقت التشغيل بمخرجات لا معنى لها أو بخطأ تشغيل عادي.

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