Dokümantasyon
/
Tarifler
/

Bytecode Array Encoding anahtarı

Bytecode Array Encoding Anahtarını Dışarıda Tutma

Pro

vmBytecodeArrayEncodingKey ile kendi VM bayt kodu şifreleme anahtarınızı verin ve çalışma zamanında bir anahtar getirici aracılığıyla geri sağlayın; anahtar paketin dışında tutulur, istemci depolamasından okunur veya arka ucunuzdan alınır.

İzle

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

YouTube'da izle

Obfuscator.io Custom Bytecode Key: Compile-Time Key and Runtime Key Getter (Cookie, Fetch, Decoy Key)

YouTube'da izle

Bu seçenekler ne yapar

vmBytecodeArrayEncoding, VM bayt kodu dizisini şifreler; böylece dizi çıktıda düz metin olarak durmaz. Varsayılan olarak şifreleme anahtarı ortamdan türetilir ve istemcide yeniden oluşturulur; dolayısıyla anahtarla hiç uğraşmazsınız. Bu kullanışlıdır, ancak anahtar malzemesi yine de paketin içinde bulunur.

İki seçenek, anahtarı paketin dışına çıkarmanıza ve kendiniz denetlemenize olanak tanır:

  • vmBytecodeArrayEncodingKey - derleme anında sağladığınız anahtar. Ayarlandığında varsayılan, ortamdan türetilen anahtar yerine kullanılır ve obfuscate edilmiş çıktıya gömülmez.
  • vmBytecodeArrayEncodingKeyGetter - aynı anahtarı çalışma zamanında döndüren bir JavaScript ifadesi. Olduğu gibi gömülür ve obfuscate edilmiş kod yüklendiğinde tarayıcıda değerlendirilir.

Amaç ayrımdır: anahtar kodun içinde olmadığı için paketin salt statik bir taraması onu elde edemez. Kodun çalışabilmesi için anahtarın çalışma zamanında yine de mevcut olması gerekir; bu nedenle gerçek anlamda gizli değildir, ancak nereden geleceğine ve kimin görebileceğine siz karar verirsiniz.

Bu iki seçenek bir çift oluşturur ve obfuscator bunu zorunlu kılar: birini diğeri olmadan ayarlamak derleme anında bir doğrulama hatasıdır (tek başına vmBytecodeArrayEncodingKey çalışma zamanında anahtarı elde etmenin hiçbir yolunu bulamaz; tek başına bir getiricinin ise uyuşacağı bir derleme anı anahtarı yoktur). Ayrıca bayt kodu dizisi gerçekten şifrelenmiyorsa hiçbir şey yapmazlar; bu nedenle vmBytecodeArrayEncoding: true da açık olmalıdır - ya da vmBytecodeArrayEncoding seçeneğini dahili olarak açan vmSelfDefending: true. İki anahtarı da bunlardan biriyle birlikte ayarlayın.

İki anahtar nasıl birleşir

Anahtarınız asla tek başına kullanılmaz; her iki tarafta da obfuscator aracının denetlediği dahili bir anahtarla karıştırılır:

  • Derleme anı. vmBytecodeArrayEncodingKey, obfuscator aracının türettiği dahili bir anahtarla birleştirilir ve bayt kodu dizisi ortaya çıkan karma anahtarla kodlanır.
  • Çalışma zamanı. vmBytecodeArrayEncodingKeyGetter getiricinizin çözümlendiği değer, bayt kodunu çözmek için istemcide çeşitli çalışma zamanı etkenlerinden yeniden oluşturulan aynı dahili anahtarla birleştirilir.

Her iki taraf da anahtarınızı dahili anahtarla karıştırdığından, getirici vmBytecodeArrayEncodingKey olarak verdiğiniz tam olarak aynı string'e çözümlenmelidir. Parçalardan hiçbiri tek başına yeterli değildir: dahili anahtar olmadan anahtarınız bayt kodunu çözemez, dahili anahtar da sizinki olmadan işe yaramaz; kodu asıl koruyan şeyin, anahtarınızı kimin aldığını denetlemek olmasının nedeni budur.

Anahtarı çalışma zamanında sağlama

Varsayılan olarak getirici senkrondur: ifade, obfuscate edilmiş kod yüklendiğinde anahtarı hemen döndürmelidir. Anahtarı istemcide zaten bulunan herhangi bir kaynaktan okuyun: bir çerez, localStorage, global bir değişken veya sunucu tarafından enjekte edilmiş bir DOM öğesi.

JavaScript

Anahtar, obfuscate edilmiş kod çalışmadan önce mevcut olmalıdır:

JavaScript

Diğer senkron kaynaklar da aynı şekilde çalışır; uygulamanızın zaten doldurduğu kaynağı seçin:

JavaScript

Anahtarı obfuscate edilmiş kodla aynı dosyanın veya betiğin dışında tutun. Onu oraya satır içi olarak yerleştirmek bütün amacı boşa çıkarır: paketin statik bir taraması hem kodu hem de anahtarını elde eder. Anahtarı ayrı bir kaynakta saklayın ve derleme anındaki vmBytecodeArrayEncodingKey değerini commit etmek yerine bir ortam değişkeninden veya gizli bilgi deposundan enjekte edin.

Anahtarı arka ucunuzdan alma (asenkron)

vmAsyncExecutor gerektirir · v7.3.0+

Senkron bir getirici yalnızca istemcide zaten bulunanı okuyabilir. Anahtarı sunucunuzdan almak için (böylece onu kimlik doğrulamanın arkasına koyabilir ve iptal edebilirsiniz) getiricinin asenkron olması gerekir ve bu da vmAsyncExecutor gerektirir. Async Executor etkinleştirildiğinde getirici bir Promise döndürebilir ve VM çalışmadan önce onu bekler.

vmAsyncExecutor seçeneğini etkinleştirmek, neyin sanallaştırılacağını da daraltır: bu modda VM'e yalnızca en dıştaki async fonksiyonlar derlenir ve senkron kod sanallaştırılmaz (obfuscation işleminin geri kalanı yine uygulanır). Programınız çoğunlukla senkronsa, korunmasını istediğiniz kodu bir async fonksiyona sarmalayın ki yine kapsama alınsın - kuralın tamamı için vmAsyncExecutor sayfasına bakın.

JavaScript

Promise döndüren bir getirici vmAsyncExecutor gerektirir. Bu derleme anında denetlenemez; bu nedenle vmAsyncExecutor kapalıyken Promise döndüren bir getirici çalışma zamanında başarısız olur.

Sunucuda, hangi anahtarın döndürüleceğine uygulamanızın güvendiği ölçüte göre karar verin: doğrulanmış bir oturum, bir lisans denetimi vb. Origin veya Referer tek başına bir çağıranın kimliğini doğrulamaz ve aynı kaynaktan gelen GET istekleri Origin başlığını içermeyebilir. İşin püf noktası şudur: güvenilmeyen çağıranları reddetmek yerine yanlış bir anahtar döndürün (aşağıdaki VM_DECOY_KEY). Bu durumda korunan kod kendiliğinden başarısız olur (hatalar, yanlış sonuçlar veya yanıt vermeyi durduran bir sayfa); bu, saldırgana neyi atlatması gerektiğini açıkça söyleyen belirgin bir 401 yanıtından daha gizlidir.

Yanıt önbelleğini devre dışı bırakın; böylece bir çağıranın anahtarı asla başka birine sunulmaz. Anahtarları doğru derleme sürümüne bağlayın ve anahtarlarla paketleri birlikte dağıtın. Gerçek anahtarı alan bir istemci onu çalışma zamanında yine de inceleyebilir.

JavaScript

Bu uç noktadan, derleme anında vmBytecodeArrayEncodingKey olarak verdiğiniz string'in tam olarak aynısını sunun. Yukarıdaki getirici göreli bir URL (/api/vm-key) getirir; bu nedenle başka bir kaynakta barındırılan bir paket kopyası /api/vm-key adresini o kaynaktan ister ve anahtarınızı hiçbir zaman almaz. Sahte anahtar, uç noktanıza ulaşan ama güvenilir bir oturumu olmayan bir çağıranın aldığı şeydir (kimliği doğrulanmamış bir istek, kaynağınız üzerinden proxy'lenen çalınmış bir paket). Her iki durumda da gerçek anahtar hiç gelmez ve korunan kod çalışmaz.

Neyin "geçerli" sayılacağı tamamen uygulamaya özgüdür: kimliği doğrulanmış bir oturum, imzalı bir lisans veya bunların herhangi bir bileşimi. Anahtarı ne üretirse üretsin, onu bir Promise içine sarın; asenkron yürütücü VM'i çalıştırmadan önce onu bekleyecektir.

Anahtar eşleşmediğinde

Obfuscate edilmiş kod yalnızca getirici, obfuscation sırasında kullanılan anahtarın tam olarak aynısını döndürdüğünde çalışır. Anahtarlar farklıysa ya da getirici undefined, null veya boş bir string döndürürse, kod çalışma zamanında başarısız olur: yanlış sonuçlar üretir, sıradan bir çalışma zamanı hatası fırlatır veya yanıt vermeyi durdurur.

Kasıtlı olarak anahtara özgü ayrı bir hata mesajı yoktur: başarısız bir anahtar, diğer herhangi bir çalışma zamanı hatasından ayırt edilemez. Bu nedenle VM ile korunan bir paket yalnızca bu seçenek devreye girdiğinde hata fırlatıyor, yanlış sonuçlar döndürüyor veya donuyorsa, önce anahtar yolunu kontrol edin: getiricinin sayfada çözümlendiğini, boş olmayan bir string döndürdüğünü ve derlemede kullandığınız değerin aynısını döndürdüğünü doğrulayın.