Cifratura di valori e array
I valori costanti e gli array dichiarati inline nel tuo codice contengono spesso informazioni sensibili, come chiavi di cifratura dei dati o altri dati critici che vuoi tenere nascosti ai disassemblatori o ai tentativi di reverse engineering. Babel Obfuscator include una funzionalità che cifra questi valori costanti e questi array, aggiungendo un ulteriore strato di protezione alle tue informazioni sensibili.
Babel Obfuscator offre opzioni di configurazione che ti permettono di cifrare i valori inline di vari tipi di dati, tra cui int32, int64, single, double e gli array. Con queste opzioni puoi rendere più sicuro il tuo codice cifrando questi tipi specifici di valori.
La cifratura dei valori int32 e int64 protegge dagli accessi non autorizzati i dati numerici di questi tipi, come gli interi e gli interi lunghi. Allo stesso modo, la cifratura dei valori single e double protegge i numeri a virgola mobile, come i decimali o i numeri reali. Cifrando questi valori inline eviti che i dati numerici sensibili del tuo codice possano essere facilmente decifrati o modificati.
Babel Obfuscator ti permette inoltre di cifrare gli array dichiarati inline nel tuo codice. Gli array sono raccolte di elementi, e cifrarli aiuta a garantire la riservatezza e l’integrità dei dati che contengono. Questo ulteriore strato di cifratura impedisce agli attaccanti di ricavare informazioni sul contenuto dei tuoi array, anche se riescono ad analizzare o decompilare il tuo codice.
Questa sezione tratta:
- Come funziona
- Valori supportati: quali costanti e quali array vengono cifrati, e quali restano invariati
- Configurazione: CLI, MSBuild e Babel Desktop
- Prestazioni e Resistenza al deoffuscamento
Come funziona
In fase di build Babel rimuove la costante dal corpo del metodo e la sostituisce con una ricerca in tabella: l’istruzione ldc del valore letterale viene riscritta in modo che il valore sia letto da una tabella cifrata incorporata nell’assembly e decifrato su richiesta in fase di esecuzione. Le costanti numeriche (int32, int64, single, double) vengono raccolte per tipo e cifrate in quella tabella, e ogni caricamento originale diventa una piccola chiamata che restituisce il valore decifrato. Gli array inline sono gestiti in modo analogo: i dati di inizializzazione dell’array, di norma memorizzati nell’assembly come blob in chiaro, vengono cifrati e ricostruiti in fase di esecuzione.
Il risultato è che un decompilatore non vede più nell’IL i numeri reali o il contenuto degli array, ma solo indici di una tabella opaca e cifrata. I valori vengono decifrati in modo differito (lazy) mentre il tuo codice è in esecuzione, quindi il comportamento non cambia.
Distribuisci su host con FIPS abilitato? I valori e gli array cifrati vengono decifrati in fase di esecuzione tramite il provider crittografico della piattaforma, quindi un container in esecuzione su un host con FIPS abilitato senza un provider FIPS di OpenSSL certificato può non avviarsi. Vedi Conformità FIPS per la causa e la soluzione.
Tieni presente che abilitare la cifratura di valori e array può introdurre un leggero overhead sulle prestazioni, dovuto alle operazioni di cifratura e decifratura in fase di esecuzione. È quindi importante valutare con attenzione il compromesso tra sicurezza e prestazioni in base alle esigenze specifiche della tua applicazione: vedi Prestazioni.