Recuperare un database di Signal danneggiato

Signal Desktop conserva ogni messaggio in un unico database SQLite, ma è avvolto nella cifratura SQLCipher, quindi uno strumento normale vede solo testo cifrato. Il percorso di ritorno ai tuoi messaggi è in due passaggi: decifrare db.sqlite localmente con la chiave che è già sul tuo computer, poi eseguire un recupero delle pagine in stile .recover sul file in chiaro; nulla di tutto ciò richiede di caricare il file più sensibile che possiedi.

Il tuo file non lascia mai il tuo dispositivo — la riparazione avviene nel browser. 0 byte caricati.

Your data is the big block — usually intact. What breaks is the small index. Repair rebuilds it.

Drop a file here or browseTap to choose a file

ZIP · Office · PDF · video · JPG · PNG · RAR/7z · SQLite — repaired right here in your browser. Nothing is uploaded

0 bytes uploadedFree: 3 repairs/day — up to 500 MB video, 100 MB docs & archives, 50 MB photos. Free download. Single repair €5.90. No account required.

Ripara ora

  1. Trascina il file
  2. La riparazione avviene in locale
  3. Scarica il risultato

Signal Desktop archivia tutta la cronologia dei messaggi in un unico database SQLite chiamato db.sqlite, ma non è SQLite e basta: Signal usa SQLCipher, un fork che cifra in modo trasparente l'intero file con AES-256, intestazione compresa. Questo significa che un motore di recupero delle pagine (questo incluso) vede solo rumore ad alta entropia e risponde file is not a database finché il file non viene decifrato. Ecco perché recuperare un database di Signal rotto sono due passaggi: prima decifrarlo localmente con la chiave che è già sul tuo computer, producendo un file SQLite in chiaro; poi trascina quel file qui sopra e lo strumento percorre le sue pagine nel tuo browser e ricostruisce un database pulito con ogni riga che riesce ancora a decodificare. Sia la chiave sia i dati restano sul tuo dispositivo.

Il db.sqlite di Signal è cifrato: decifralo prima di qualsiasi recupero

Il database di Signal Desktop si trova in ~/Library/Application Support/Signal/sql/db.sqlite su macOS, in %AppData%\Signal\sql\db.sqlite su Windows e in ~/.config/Signal/sql/db.sqlite su Linux. Poiché SQLCipher cifra l'intero file, eseguire file db.sqlite mostra byte casuali invece della consueta firma SQLite format 3\0. Qualsiasi strumento SQLite normale — l'interprete sqlite3, DB Browser o il motore di recupero di questa pagina — vede testo cifrato, non pagine, e non può né vuole indovinare la chiave.

La chiave SQLCipher di 64 caratteri esadecimali si trova in config.json, accanto al database. Nelle versioni più vecchie è memorizzata in chiaro sotto un campo key; dal 2024 Signal la avvolge sotto encryptedKey usando l'API safeStorage di Electron, sostenuta dall'elemento del Portachiavi di macOS chiamato "Signal Safe Storage", da DPAPI su Windows e da gnome-libsecret / kwallet su Linux. Poiché l'involucro è legato al tuo account del sistema operativo, la chiave si scarta sulla stessa macchina e con lo stesso utente che l'hanno creata.

Con la chiave grezza a disposizione, apri il database in un qualsiasi strumento compatibile con SQLCipher (la CLI sqlcipher, oppure una build di DB Browser for SQLite compilata con SQLCipher) ed esegui PRAGMA key = "x'<chiave-64-hex>'"; seguito da PRAGMA cipher_compatibility = 4; — Signal include SQLCipher 4. Poi esporta una copia in chiaro con .recover o con VACUUM INTO 'plain.sqlite'. Quel file in chiaro è quello che trascini qui. Lavora sempre su una copia byte per byte, mai sul tuo unico originale.

Cosa significa "malformed" all'interno di un database di Signal

Una volta decifrato, un database di Signal è un normale file SQLite: un array piatto di pagine di dimensione fissa (4096 byte ciascuna). La pagina 1 contiene l'intestazione e lo schema; ogni tabella e indice è un b-tree di pagine interne che puntano verso il basso, alle pagine foglia che contengono le righe. I dati di Signal risiedono in tabelle come messages (ogni riga identificata da id, con conversationId, sent_at, received_at, type, una colonna body e una colonna json che porta il record completo del messaggio), conversations, reactions, sessions, items e un indice full-text messages_fts (FTS5) usato per le ricerche.

La corruzione è quasi sempre localizzata. Un'interruzione di corrente a metà di una scrittura, una sincronizzazione interrotta, una pagina lacerata su uno storage che ha mentito sul flush: un solo puntatore di un b-tree smette di concordare con i dati e SQLite solleva SQLITE_CORRUPT: Error: database disk image is malformed (11). Rifiuta l'intero file nell'istante in cui non può più fidarsi della struttura, anche se le altre tabelle sono lì intatte nelle loro pagine foglia. Il file sembra molto peggio di quanto sia davvero.

L'errore correlato file is not a database (SQLITE_NOTADB, codice 26) ha qui due significati: o la firma di 16 byte dell'intestazione è stata danneggiata (le pagine che ci sono dietro sono spesso intatte), oppure — molto più comune con Signal — hai puntato uno strumento normale al file ancora cifrato. Se lo vedi prima di decifrare, è la cifratura che parla, non un danno.

Cosa recupera il recupero delle pagine da un DB di Signal, e cosa no

Il recupero delle pagine non ripara il file rotto sul posto; fa ciò che fa il .recover di SQLite stesso. Percorre il file decifrato pagina per pagina e, per ogni pagina che sembra una foglia di tabella, legge direttamente ogni cella — rowid, tipi seriali, valori — e reinserisce ogni riga decodificabile in un database nuovo e vuoto. Le pagine danneggiate vengono saltate; le pagine leggibili cedono le loro righe, che il b-tree che le indicizzava sia sopravvissuto o no. Le righe che la catena di puntatori non raggiunge più vengono trovate con una scansione grezza, e le righe la cui tabella di origine non può essere identificata finiscono in una tabella lost_and_found indicizzata per pagina e cella, invece di essere scartate. In pratica, le tue righe di messages tornano con il loro body e il loro json intatti anche se a rompersi è stato l'indice FTS o l'albero di una singola conversazione.

Se il crash ha lasciato un file gemello -wal (la modalità WAL prepara le transazioni confermate più recenti prima di riversarle — checkpoint — in db.sqlite), lì ci sono i tuoi messaggi più recenti, ma anch'esso è cifrato con SQLCipher, quindi decifralo insieme al file principale. Dato un database in chiaro e il suo WAL in chiaro, il motore sovrappone i frame confermati prima della scansione, così il recupero riflette l'ultima transazione confermata.

I limiti onesti sono reali. Gli allegati non sono nel database: Signal salva foto, video e file come blob separati e cifrati individualmente sotto attachments.noindex/, quindi una riga di messages recuperata conserva il puntatore e i metadati, ma recuperare il DB non decifra il file multimediale in sé. Tutto ciò che è stato fisicamente sovrascritto o troncato dalla fine del file è perso: un file SQLite non ha ridondanza con cui ricostruirlo. E l'output recuperato è sempre sospetto: poiché la scansione legge celle grezze, incluse le pagine della freelist, possono riaffiorare messaggi cancellati e un valore può tornare con la classe di archiviazione sbagliata, quindi verificalo rispetto a una fonte nota e affidabile prima di farci affidamento.

Perché questo deve stare sulla tua macchina

Il database di un messenger è il singolo file che meno vorresti su un server che non controlli: è ogni conversazione, ogni contatto e ogni gruppo che hai conservato. I servizi di "riparazione" basati sul caricamento copiano quel file su un'infrastruttura che non puoi ispezionare, secondo condizioni di conservazione che non hai scritto tu; e con un database di Signal, questo smonta in silenzio tutto il senso di usare Signal.

Qui il recupero viene eseguito interamente nella scheda del tuo browser: il file in chiaro viene letto dal disco, ricostruito localmente e scaricato, e puoi aprire la scheda Rete (Network) e vedere uscire 0 byte. Altrettanto importante: anche il passaggio di decifratura resta locale — la tua chiave SQLCipher proviene dal tuo Portachiavi (o da config.json) ed è usata da uno strumento sulla tua macchina, mai trasmessa. Recuperare un database di Signal in questo modo significa non affidare a nessuna terza parte né i dati né la chiave.

Cosa può e cosa non può riparare

Può riparare

  • Un database di Signal che hai decifrato in chiaro (con sqlcipher o una build di DB Browser con SQLCipher) e che poi segnala "database disk image is malformed"
  • Righe di messages — la colonna body e il record json completo — estratte dalle pagine foglia del b-tree sopravvissute
  • conversations, reactions e altre tabelle quando una sola pagina o un solo puntatore difettoso ha fatto crollare l'intero file
  • Righe che la catena di puntatori non raggiunge, tramite una scansione grezza delle pagine, con le righe non attribuibili collocate in una tabella lost_and_found
  • I messaggi più recenti da un file gemello -wal decifrato, sovrapposti prima della scansione

Non può riparare

  • Il db.sqlite ancora cifrato in sé: decifralo prima in locale; il motore recupera SQLite in chiaro, non testo cifrato SQLCipher
  • Qualsiasi cosa senza la chiave: un encryptedKey che non puoi scartare (Portachiavi perso, un'altra macchina o un altro utente) non diventa mai SQLite leggibile
  • Gli allegati dei messaggi: vivono come file cifrati separatamente sotto attachments.noindex/, non dentro il database
  • Messaggi fisicamente sovrascritti o troncati dalla fine del file: nessuno strumento può inventarli
  • Una garanzia di correttezza: possono riaffiorare righe cancellate e i tipi possono cambiare; verifica i dati recuperati prima di farci affidamento

Se una riparazione fallisce, ti diciamo perché (dati mancanti rispetto a struttura danneggiata), e non ti viene mai addebitato nulla per una riparazione fallita.

Domande frequenti

Questo strumento può decifrare il mio db.sqlite di Signal al posto mio?

No: è un recupero delle pagine in chiaro, non un decifratore. Il db.sqlite di Signal è cifrato con SQLCipher, quindi prima lo decifri localmente con la tua chiave (nella CLI sqlcipher o in una build di DB Browser con SQLCipher, usando PRAGMA key = "x'…'" e PRAGMA cipher_compatibility = 4) e poi esporti una copia in chiaro con .recover o VACUUM INTO. Trascina qui quel file in chiaro. Sia la chiave sia i dati restano sulla tua macchina per tutto il tempo.

Dove tiene Signal la chiave e perché mi serve config.json?

La chiave SQLCipher di 64 caratteri esadecimali è salvata in config.json, accanto al database. Le versioni più vecchie la mantengono in chiaro sotto un campo key; dal 2024 Signal la avvolge sotto encryptedKey con la safeStorage di Electron (elemento del Portachiavi di macOS "Signal Safe Storage", DPAPI su Windows, libsecret/kwallet su Linux). Poiché quell'involucro è legato al tuo account di sistema, puoi scartare la chiave solo sulla stessa macchina e con lo stesso utente che hanno creato il database.

Signal dice che il database disk image è malformed. È tutto perso?

Quasi mai. Quel messaggio è SQLITE_CORRUPT (codice di risultato 11): SQLite ha seguito un puntatore e si è imbattuto in una pagina che non è una pagina b-tree valida, quindi rifiuta l'intero file. Il danno di solito si limita a una pagina e a ciò che pende da essa in un unico b-tree; il resto dei tuoi messages, conversations e delle altre tabelle resta intatto nelle sue pagine foglia, che è esattamente ciò che estrae un percorso delle pagine.

Torneranno anche le mie foto e i miei file?

Non dal database. Signal salva gli allegati come file separati e cifrati individualmente sotto attachments.noindex/; il database contiene solo puntatori e metadati verso di essi. Recuperare il DB ti restituisce le righe dei messaggi e i loro riferimenti, ma i blob multimediali vengono decifrati a parte a partire dalla chiave principale: recuperare il database non decifra i file in sé.

Il mio database di Signal viene caricato per essere riparato?

No. Il file decifrato viene letto dal tuo disco e ricostruito nella scheda del tuo browser; non viene trasmesso nulla, e puoi confermare che escono 0 byte nella scheda Rete (Network). Questo conta più per il database di un messenger che per quasi qualsiasi altro file — è tutta la tua cronologia delle conversazioni — e anche il passaggio di decifratura resta locale, così la tua chiave SQLCipher non viene mai inviata da nessuna parte.

Correlati: Riparare un database SQLite danneggiato · Riparare una cartella di lavoro Excel · Verifica che non venga caricato nulla