Dokümantasyon
/
Tarifler
/

Bayt kodu dizisi kodlama anahtarı

Bytecode Dizisi Kodlama Anahtarını Dışarı Taşıma

Pro

vmBytecodeArrayEncodingKey ile kendi VM bytecode şifreleme anahtarınızı sağlayın ve çalışma zamanında bir anahtar getter aracılığıyla geri verin — pakete dahil edilmez, istemci deposundan okunur ya da arka ucunuzdan alınır.

Bu seçenekler ne yapar

vmBytecodeArrayEncoding VM bytecode dizisini şifreler, böylece çıktıda düz metin olarak yer almaz. Varsayılan olarak şifreleme anahtarı ortamdan türetilir ve istemcide yeniden oluşturulur, dolayısıyla onunla hiç uğraşmazsınız. Bu kullanışlıdır, ancak anahtar malzemesi yine de pakette bulunur.

İki seçenek, anahtarı paketten çıkarıp kendiniz kontrol etmenize olanak tanır:

  • vmBytecodeArrayEncodingKeyderleme zamanı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.
  • vmBytecodeArrayEncodingKeyGetteraynı anahtarı çalışma zamanında döndüren bir JavaScript ifadesi. Aynen gömülür ve obfuscate edilmiş kod yüklendiğinde tarayıcıda değerlendirilir.

Amaç ayrımdır: anahtar kodda olmadığından, paketin salt statik bir taraması onu geri elde edemez. Kodun çalışması için yine de çalışma zamanında mevcut olması gerekir, bu yüzden gerçekten gizli değildir — ancak nereden geldiğine ve kimin görebileceğine siz karar verirsiniz.

İki anahtar nasıl birleşir

Anahtarınız hiçbir zaman tek başına kullanılmaz — her iki tarafta da obfuscator'ın kontrol ettiği dahili bir anahtarla karıştırılır:

  • Derleme zamanı. vmBytecodeArrayEncodingKey, obfuscator'ın türettiği dahili bir anahtarla birleştirilir ve bytecode dizisi ortaya çıkan karışık anahtarla kodlanır.
  • Çalışma zamanı. vmBytecodeArrayEncodingKeyGetter ifadenizin çözümlendiği değer, bytecode'u çözmek için istemcide çeşitli çalışma zamanı faktörlerinden yeniden oluşturulan aynı dahili anahtarla birleştirilir.

Her iki taraf da anahtarınızı dahili anahtarla karıştırdığı için, getter vmBytecodeArrayEncodingKey olarak ilettiğiniz tam olarak aynı dizeye çözümlenmelidir. Hiçbir parça tek başına yeterli değildir: dahili anahtar olmadan anahtarınız bytecode'u çözemez ve dahili anahtar sizinki olmadan işe yaramaz — bu yüzden anahtarınızı kimin aldığını kontrol etmek, kodu gerçekten koruyan şeydir.

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

Varsayılan olarak getter eşzamanlıdır (senkron): ifade, obfuscate edilmiş kod yüklendiğinde anahtarı hemen döndürmelidir. Onu istemcide zaten mevcut olan herhangi bir kaynaktan okuyun — bir çerez, localStorage, bir global değişken ya da sunucu tarafından enjekte edilen bir DOM öğesi.

JavaScriptObfuscator.obfuscate(sourceCode, {
    vmObfuscation: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: process.env.VM_KEY,       // e.g. 'mySecretKey123'
    vmBytecodeArrayEncodingKeyGetter: "window.__VM_KEY__" // returns the key at runtime
});

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

// Set by a different script, a server-injected inline script, etc.
window.__VM_KEY__ = 'mySecretKey123';

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

// From a cookie
vmBytecodeArrayEncodingKeyGetter: "document.cookie.match(/vmKey=([^;]+)/)?.[1]"

// From localStorage
vmBytecodeArrayEncodingKeyGetter: "localStorage.getItem('vmKey')"

// From a server-injected meta tag
vmBytecodeArrayEncodingKeyGetter: "document.querySelector('meta[name=\"vm-key\"]').content"

// From a nested object
vmBytecodeArrayEncodingKeyGetter: "window.config.encryption.key"

Anahtarı arka ucunuzdan alma (asenkron)

Gerektirir vmAsyncExecutor · v7.3.0+

Senkron bir getter yalnızca istemcide zaten var olanı okuyabilir. Anahtarı sunucunuzdan almak için — böylece onu kimlik doğrulamasının arkasına alıp iptal edebilirsiniz — getter'ın asenkron olması gerekir ve bu da vmAsyncExecutor gerektirir. Asenkron yürütücü etkinken getter bir Promise döndürebilir ve VM, çalışmadan önce onu bekler.

JavaScriptObfuscator.obfuscate(sourceCode, {
    vmObfuscation: true,
    vmAsyncExecutor: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: process.env.VM_KEY,       // kept on your server, not in the bundle
    vmBytecodeArrayEncodingKeyGetter:
        'fetch("/api/vm-key", { credentials: "include" }).then((res) => res.text())'
});

Sunucuda, uygulamanızın güvendiği her neyse ona dayanarak hangi anahtarı döndüreceğinize karar verin — geçerli bir oturum, beklenen bir Origin ya da Referer, bir lisans kontrolü vb. İşin püf noktası: güvenilmeyen çağıranları reddetmek yerine yanlış bir anahtar döndürün. O zaman bytecode çöpe çözümlenir ve korumalı kod kendiliğinden başarısız olur; bu, saldırgana neyi atlaması gerektiğini tam olarak söyleyen bariz bir 401'den daha gizlidir.

// Express example — the exact checks depend on your app
app.get('/api/vm-key', (req, res) => {
    const origin = req.get('origin');
    const trusted =
        req.session?.user &&                       // a valid session, and
        origin === 'https://app.example.com';      // the expected production origin

    res.type('text/plain').send(
        // Real key for valid users; a decoy for everyone else
        // (no session, or a localhost / unexpected origin).
        trusted ? process.env.VM_KEY : process.env.VM_DECOY_KEY
    );
});

Bu uç noktadan, derleme zamanında vmBytecodeArrayEncodingKey olarak ilettiğiniz dizenin tam olarak aynısını sunun. Ortamınızın dışında çalışan bir paket kopyası, tuzak anahtarı alır, hiçbir şeye çözülür ve etkisiz kalır.

Anahtar eşleşmediğinde

Obfuscate edilmiş kod yalnızca getter, obfuscate sırasında kullanılan anahtarın tam olarak aynısını döndürdüğünde çalışır. Anahtarlar farklıysa — ya da getter undefined, null veya boş bir dize döndürürse — şifre çözme yanlış bir anahtar akışı üretir ve kod çalışma zamanında çöp çıktı ya da sıradan bir çalışma zamanı hatasıyla başarısız olur.

Kasıtlı olarak, anahtara özgü ayrı bir hata mesajı yoktur: başarısız bir anahtar, herhangi bir başka çalışma zamanı arızasından ayırt edilemez. Bu nedenle, VM korumalı bir paket yalnızca bu seçenek devredeyken hata fırlatıyorsa, önce anahtar yolunu kontrol edin — getter'ın sayfada çözümlendiğini, boş olmayan bir dize döndürdüğünü ve derleme yaptığınız değerle aynı değeri döndürdüğünü.