Dokümantasyon
/
Tarifler
/

Bayt Kodu Dizi Anahtarını Arka Uçtan Alma

Fetching the Bytecode Array Key from Backend

Pro
v7.3.0+

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. vmAsyncExecutor etkinken bir Promise dö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ı. vmBytecodeArrayEncodingKeyGetter ifadenizin çö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
    );
});