اگر هنوز نمیدونید یون کیوب چیه و چیکار میکنه پیشنهاد میکنم مقاله قبلی با عنوان یون کیوب چیست رو بخونید. به طور خلاصه یون کیوب انکودر ابزاریه که سورس کدهای php شما رو کدگذاری میکنه تا کسی نتونه اون ها رو کپی یا ویرایش کنه. با این حال سایت ها و افرادی هستند که به روش های مختلفی از جمله نفوذ به ماژول php ادعا میکنند دیکودر یون کیوب دارند و می توانند فایل های کد شده رو بازگشایی کنند. اگر میخواهید دیکودرها قادر به دیکود کردن فایل های یون کیوبی شما نباشند باید از کلیدهای داینامیک یا کلید اکسترنال کمک بگیرید.

انواع کدگذاری در یون کیوب

کدگذاری استاندارد

فرایند کدگذاری و رمزگشایی در یون کیوب در حالت استاندارد
کدگذاری استاندارد در یون کیوب

در این حالت، کلید کدگذاری بخشی از فایل کدگذاری شده است و نیازی به کلید رمزگشایی مجزا وجود ندارد. این مکانیزم بصورت پیشفرض در یون کیوب و سایر ابزارهای کدگذاری استفاده می شود.

کلیدهای اکسترنال

فرایند کدگذاری و رمزگشایی در یون کیوب در حالت کلید اکسترنال
کدگذاری در یون کیوب با استفاده از کلید های اکسترنال

کلید های اکسترنال از فایل کدگذاری شده مجزا هستند و برای اجرای فایل کدگذاری شده ضروری هستند. اگر کلید اکسترنال در دسترس نباشد فایل کدگذاری شده اجرا نخواهد شد. کلیدهای اکسترنال باید برای رمزگشایی در دسترس باشند، پس هر کسی می تواند محتوای کلید را تشخیص دهد.

کلیدهای داینامیک

فرایند کدگذاری و رمزگشایی در یون کیوب در حالت کلید داینامیک
کدگذاری در یون کیوب با استفاده از کلید های داینامیک

در این حالت کلید رمزگشایی در زمان اجرای فایل کدگذاری شده ساخته می‌شود و برخلاف سایر روش ها، کلید بصورت استاتیک در دسترس نیست.

وقتی کلید در حین اجرا ساخته می‌شود برای رمزگشایی بخشی از کد که ممکن است هریک از توابع شما باشد استفاده می‌شود و اگر مقدار کلید اشتباه باشد، اجرای کد با خطا مواجه می شود. در تصویر فوق، فایل کدگذاری شده شامل تابعی است که توسط کلید داینامیک keygen رمزنگاری شده است. کلید داینامیک خودش یک تابع است که در فایل مجزایی قرار گرفته است و توسط یون کیوب کدگذاری شده است. برای اجرای فایل اولیه می باید علاوه بر رمزگشایی کل فایل، تابع مورد نیاز رمزگشایی شود و رمزگشایی تابع نیز منوط به اجرای فایل کد گذاری شده keygen و دریافت خروجی کلید از آن است. در صورتی که خروجی کلید صحیح باشد مقدار آن برای کلید داینامیک ارسال شده و تابع رمزنگاری شده در فایل اولیه نیز بازگشایی و اجرا می شود.
حالا فرض کنید چند تابع با چند کلید داینامیک وجود داشته باشد.

کلید داینامیک و کلید اکسترنال در یون کیوب

برای اینکه دیکودرهای یون کیوب نتونند فایل های قفل شده را دیکود کنند توسعه دهندگان یون کیوب کلیدهایی با عنوان کلید خارجی یا همون کلید اکسترنال (External Key) و کلید داینامیک (Dynamic key) را طراحی کردند که به کمک اونها میتونید قفل فایل های انکود شده رو پیچیده تر و قوی تر کنید و دیکود کردنشونو غیرممکن کنید.

قفل گذاری با کلیدهای داینامیک یا داینامیک کی (Dynamic Key) در یون کیوب انکودر روشی از کدگذاری هست که به وسیله اون میتونیم امنیت سورس کدهامون رو بالاتر ببریم.

انکود فایل php با کلید داینامیک بهتره یا کلید اکسترنال؟

همونطور که گفتیم کلید اکسترنال همواره یک جایی هست که می توان به آن دسترسی پیدا کرد و روی کل فایل های قفل گذاری شده فقط یک کلید اکسترنال اعمال میشه، به همین خاطر باز کردن یا رمزگشایی فایل هایی که با کلید اکسترنال قفل شدند خیلی پیچیده نیست.

اما در نقطه مقابل، باز کردن یا دیکود کردن فایل های PHP قفل شده با کلیدهای داینامیک به شدت سخت تر از حالتیه که فایل های شما با کلید اکسترنال (External Key) قفل شدند چون کلید داینامیک هیچ کجا نیست و در خود کدهای قفل شده وجود دارد و تا زمانی که رمزگشایی یون کیوب انجام نشود، محتوای کلیدهای داینامیک پنهان در سورس کد نیز قابل مشاهده و دسترسی نیست.

یک مزیت دیگه کلید داینامیک هم اینه که میتونیم برای هر بخش از کدهامون یک کلید جدید بگذاریم که با کلید قبلی فرق کنه و اینجوری باز کردن قفل ها خیلی خیلی سخت تر میشه!

شاید درک نقش کلید داینامیک در امنیت فایل های قفل شده کمی سخت باشه اما کمی صبر کنید تا متوجه بشید منظورم چی هستش…

برای ساخت ioncube dynamic key چی کار باید بکنیم؟

  1. توابع قفل موردنظر ما، کدهای php هستند و محافظت از این کدها یعنی محافظت از همه چیز. حالا برای اینکه تابعی را قفل کنیم کافیه یک عبارت خاص به صورت کامنت را قبلش درج کنیم.

این عبارت خاص که همون کامنت معروف برای تعریف کلید داینامیک یون کیوب هستش یک کامنت تک خطیه که به صورت خاصی تعریف شده (برای تعریف کامنت تنها کاری که باید بکنید اینه که دو علامت // در ابتدای خط درج کنید)

// @ioncube.dynamickey https://www.example.com/secret -> "as5a61zsd24g6e"  [optional algorithm]

حالا که کامنت کلید داینامیک یون کیوب درج شده هر تابعی که بعد از این خط کامنت قرار میگیره قفل میشه

کالبدشکافی کامنت مخصوص داینامیک کی

بخش اول یعنی عبارت “// @ioncube.dynamickey” که داره میگه این یک داینامیک کی هست و باید عینا نوشته بشه. توجه داشته باشید بجای عبارت فوق میتونید عبارت  “// @ioncube.dk” هم استفاده کنید.

چیزی که سمت راست عبارت -> هست (منظورمون انتهای خط هستش)، همون رمزی هست که باهاش کد ما قفل میشه (موقعی که فایل توسط یون کیوب کدگذاری میشه این کد برای رمز گزاری استفاده میشه) . از این به بعد به این بخش میگیم “کلید کدگذاری”

چیزی که دست چپ هست (بعد از عبارت مخصوص تعریف داینامیک کی)، موقع اجرای کد در هاست مشتری، فراخوانی میشه و  خروجی یا نتیجه به دست اومده از این قسمت برای باز کردن کد استفاده میشه. از این به بعد به این بخش میگیم “کلید رمزگشایی”

اگر مقدار خروجی یا نتیجه این بخش از کد با مقداری که در حین عملیات کدگذاری مورد استفاده قرار گرفته یکسان نباشه، خطا نمایش داده میشه و اگر خروجی یکسان باشد (یعنی کلید کدگذاری با مقدار نتیجه یا خروجی کلید رمزگشایی یکسان باشه)، رمزگشایی انجام میشه و فایل قفل شده به درستی اجرا میشه. در نتیجه چیزی که سمت چپ هست همیشه باید یک مقدار خروجی ثابت داشته باشه که عینا برابر با مقدار کلید تعریف شده در سمت راست هستش.

در نهایت، انتهای خط به جای عبارت [optional algorithm] میتونه عبارت random یا basic به صورت دلخواه قرار بگیره. اگر هم کلا این بخش را تعریف نکنید خودش عملکردی شبیه random را به همراه داره. (بعد از نمونه ها این بخش رو یکم بیشتر توضیح دادیم)

نمونه‌های دیگری از Dynamic key در یون کیوب

موافقید یکم دیگه نمونه کد تعریف داینامیک کی در یون کیوب رو کاملترش کنیم؟

1- فراخوانی کلید از آدرس اینترنتی

// @ioncube.dynamickey https://www.example.com/secret -> "as5a61zsd24g6e"
function test_function($a)
{
echo $a;
}

در مثال بالا، فایل ما با کلید “as5a61zsd24g6e” قفل میشه و موقع اجرای فایل باید مسیر اینترنتی “https://www.example.com/secret” فراخوانی بشه و در صورتی که خروجی این مسیر عبارت “as5a61zsd24g6e” باشه فایلمون اجرا میشه و در غیر اینصورت اگر خروجی متفاوت باشه یا حتی اگر اون مسیر اینترنتی در دسترس نباشه همه چیز قطع میشه و کد اجرا نمیشه.

2- محاسبه کلید از روی متغیر

مثال پایین روش دیگه ای هست که در عمل باز هم همون کار رو انجام میده

// @ioncube.dk $x -> "58" RANDOM
function test_function($a)
{
  Echo $a;
}
$x = 53;
$x += 5;
test_function($v); 

در مثال بالا، فایل ما با کلید “58” قفل میشه و موقع اجرای فایل باید مقدار متغیر x فراخوانی بشه و در صورتی که نتیجه محاسبه این متغیر “58” باشه فایلمون اجرا میشه و در غیر اینصورت اگر خروجی متفاوت باشه یا نتیجه متغیر x در همین مرحله محاسبه نشده یا نامشخص باشه، همه چیز قطع میشه و کد اجرا نمیشه.

3- محاسبه کلید از روی یک تابع

function concatfn($first,$second)
        {
            $phrase = ucfirst($first) . ' ';
            $phrase .= ucfirst($second) . ' again!';
            return $phrase;
        }
// @ioncube.dk concatfn("hello","world") -> "Hello World again!"
function test_function($a)
{
  Echo $a;
}

test_function($v);

در مثال بالا، فایل ما با کلید “Hello World again!” قفل میشه و موقع اجرای فایل باید خروجی تابع concatfn فراخوانی بشه و در صورتی که خروجی تابع “Hello World again!” باشه فایلمون اجرا میشه و در غیر اینصورت اگر خروجی متفاوت باشه یا در همین مرحله محاسبه نشده یا نامشخص باشه، همه چیز قطع میشه و کد اجرا نمیشه.

10 سورس کد بیشتر برای استفاده از کلید داینامیک را در ایمیل خود دریافت کنید

بایدها و نبایدهای کلید داینامیک در یون کیوب

  • کلیدی که سمت چپ هست (کلید رمزگشایی) همیشه باید یک string یا حتی عدد رو برگردونه، اما آرایه یا آبجکت یا چیزای دیگه نباید باشه.
  • اگر از متغییر بعنوان کلید رمزگشایی استفاده میکنید (مثال دوم) باید یک متغییر ساده باشه و نباید عضوی از آرایه را استفاده کنید. مثل a[‘key’]
  • اگر از یک فایل بعنوان کلید رمزگشایی استفاده میکنید، باید مسیر کامل فایل با کلمه file:// باشه و اگر از url استفاده میکنید باید حتما با http یا https شروع بشه.
  • هواستون باشه از توابع پیشفرض php استفاده نکنید که خطا ایجاد میکنه (مثلا strrev(‘ali’) )
  • کلید رمزگشایی باید تابعی با حفظ شرایط فوق تعریف بشه اما داخل توابعی که تعریف شدند میتونید از انواع توابع php استفاده کنید و هیچ محدودیتی از این نظر وجود ندارد و صرفا نتیجه خروجی تابع برای رمزگشایی استفاده می شود.
  • یک سوال خیلی مهم که خیلی ها مطرح کردید اینه که اگر بخواهید با یک کلید داینامیک کل اسکریپت رو قفل کنید باید چی کار کنید؟ باید از حالت url یا فایل استفاده کنید (مثال اول) و کلید داینامیک رو ابتدای فایل اصلی که اول از همه لود میشه قرار بدید

کدگذاری قوی‌تر کلید داینامیک با الگوریتم Random

همونطور که بالاتر توضیح دادیم، در انتهای کامنت تعریف کلید داینامیک میتونید از کلمه random یا basic استفاده کنید. اگر هم چیزی ننویسید یک الگوریتم داخلی شبیه رندوم استفاده میشه.

نکته مهم اینه که استفاده از رندوم قوی تر هست اما سرعت اجرای بیسیک بیشتره! توصیه ما اینه که اگر در چند مورد از کلید داینامیک استفاده کردید از همان حالت random کمک بگیرید و نگران سرعت اجرا نباشید.

آموزش ویدئویی روش استفاده از کلید داینامیک

نکات خیلی مهم در استفاده از کلید داینامیک

نباید همه چیز رو با کلیدهای داینامیک قفل کنید. میپرسید چرا؟ چون مگه چی نوشتید که همش مهمه؟!!! کلا داینامیک کی، هم قفل گذاشتنش سنگینه و هم اجراش (از نظر پیچیدگی فرایندها). برای همین همه چیزو الکی قفل نکنید!

به عبارتی شما فقط باید بخش های اصلی کد رو قفل کنید که کل کد به اون وابسته هستش، یه مثال خیلی ساده بخوام بزنم اینه که فرض کنید من یک کد نوشتم که به یک ربات متصل میشه و پیام میفرسته و میگیره. لازم نیست همه کدم رو با کلید قفل کنم، میتونم فقط بخشی که به ربات وصل میشه رو قفل کنم که قلب اصلی سیستم هست و بخش هایی که برای ارسال و دریافت پیام هست به صورت ساده با یون کیوب کدگذاری کنم. اینجوری هم سبک تر هست و هم سریعتر.

سوالات شما

کدگذاری در یون کیوب با کلید داینامیک بهتره یا کلید اکسترنال؟

کلید داینامیک تنها راه حل توصیه شده توسط یون کیوب برای کد کردن فایل ها با ضریب اطمینان بسیار بالا است.

چطور میتونم موقع استفاده از یون کیوب انکودر روی فایل PHP کلید داینامیک قرار بدم؟

کافیه یک کامنت به فرمت خاصی را در ابتدای فانکشن های موردنظرتان قرار دهید که در همین مقاله توضیحات کامل و نمونه سورس کدهای آماده را برای درک کامل کلید داینامیک قرار داده ایم.

از کجا میشه خدمات کدگذاری با یون کیوب و کلید داینامیک رو دریافت کرد؟

سایت کپی بن در انکودر آنلاین یون کیوب این خدمات رو در اختیار شما قرار میده