Bytecode Dizisi Kodlama Anahtarını Dışarı Taşıma
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:
vmBytecodeArrayEncodingKey— derleme 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.vmBytecodeArrayEncodingKeyGetter— aynı 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ı.
vmBytecodeArrayEncodingKeyGetterifadenizin çö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ü.
