Fetching the Bytecode Array Key from Backend
VM bayt kodu şifre çözme anahtarını istemciden uzak tutun: yükleme sırasında asenkron bir anahtar getirici ile arka ucunuzdan alın; kimlik doğrulamanın arkasına yerleştirin, böylece çalınan bir paket işlevsiz kalır.
Sorun
vmBytecodeArrayEncoding VM bayt kodunu bir anahtarla şifreler. O anahtar paketin
içinde gönderilirse, dosyaya sahip olan herkes şifresini çözmek için gereken her şeye sahip olur. Bir
vmBytecodeArrayEncodingKeyGetter, anahtarın başka bir yerde bulunmasına ve çalışma zamanında üretilmesine olanak
tanır — ancak senkron bir getirici yalnızca istemcide zaten mevcut olanı (bir global, bir çerez, localStorage)
okuyabilir. Anahtarı sunucunuzdan almak için — böylece onu kimlik doğrulamanın arkasına yerleştirebilir ve iptal
edebilirsiniz — getiricinin asenkron olması gerekir.
Çözüm
vmAsyncExecutor seçeneğini etkinleştirin (v7.3.0+). Asenkron yürütücü ile
anahtar getirici bir Promise döndürebilir, böylece VM çalışmadan önce anahtarı arka ucunuzdan fetch edebilir. Üç
seçenek birlikte çalışır:
vmBytecodeArrayEncoding: true— bayt kodu dizisini şifreler.vmBytecodeArrayEncodingKey— derleme zamanında kullanılan anahtar (paketin içinde değil, sunucunuzda tutulur).vmBytecodeArrayEncodingKeyGetter— çalışma zamanında aynı anahtarı döndüren bir JS ifadesi.vmAsyncExecutoretkinken birPromisedöndürebilir; etkin değilken getirici anahtarı senkron olarak döndürmelidir.
İstemci obfuscation yapılandırması
JavaScriptObfuscator.obfuscate(sourceCode, {
vmObfuscation: true,
vmAsyncExecutor: true,
vmBytecodeArrayEncoding: true,
vmBytecodeArrayEncodingKey: process.env.VM_KEY, // e.g. 'mySecretKey123'
vmBytecodeArrayEncodingKeyGetter:
'fetch("/api/vm-key", { credentials: "include" }).then((res) => res.text())'
});
Getirici ifadesi olduğu gibi gömülür ve tarayıcıda değerlendirilir. Derleme zamanı vmBytecodeArrayEncodingKey değerini
istemci deponuzun dışında tutun — derleme sırasında bir ortam değişkeninden veya gizli bilgiden enjekte edin ve
aşağıdaki uç noktadan tam olarak aynı dizeyi sunun.
İki anahtar nasıl çalışır
Anahtarınız asla 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 bayt kodu dizisi elde edilen karışık anahtarla kodlanır. - Çalışma zamanı.
vmBytecodeArrayEncodingKeyGetterifadenizin çözümlendiği değer — sunucunuz tarafından döndürülür — bayt kodunu çözmek için, çeşitli çalışma zamanı etkenlerinden istemcide yeniden oluşturulan aynı dahili anahtarla birleştirilir.
Her iki taraf da anahtarınızı dahili anahtarla karıştırdığından, getirici vmBytecodeArrayEncodingKey olarak
geçirdiğiniz tam olarak aynı dizeye çözümlenmelidir. Hiçbir parça tek başına yeterli değildir: dahili anahtar
olmadan anahtarınız bayt kodunu çözemez ve sizinki olmadan dahili anahtar işe yaramaz — bu yüzden anahtarınızı yalnızca
kimliği doğrulanmış çağıranlara sunmak, çalınan bir paketi işlevsiz bırakır.
Sunucu tarafı
Uç nokta, uygulamanızın güvendiği her neyse ona göre — geçerli bir oturum, beklenen bir Origin veya Referer, bir
lisans kontrolü vb. — hangi anahtarı döndüreceğine karar verir. İşin püf noktası: güvenilmeyen çağıranları reddetmek
yerine yanlış bir anahtar döndürün. Bayt kodu bu durumda çöpe çözümlenir ve korunan 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
);
});
