Nei giorni successivi alla pubblicazione del data leak che ha riguardato Twitter, si è registrato un significativo numero di utenti del darkweb intenti nell’attività di “ripulitura” dei record di dati esfiltrati; il caso di Twitter obbliga ad un riflessione su come i dati che cediamo a terzi nel corso della nostra vita digitale non possano mai essere considerati del tutto al sicuro, anche quando custoditi da società con un know how tecnico di rilievo come Twitter. E’ perciò d’obbligo avere sempre piena consapevolezza di ciò che condividiamo online ma soprattutto del valore dell’eventuale perdita di possesso dei nostri dati.
Il mercato dei dati
In questo frangente però, il punto di vista che vogliamo considerare è un altro, trattandosi di un’interessante occasione per fornire una panoramica di alto livello della tipologia di dati normalmente reperita sul “mercato nero” del web e del perché i dati spesso risultino inutilizzabili se non vengono sottoposti ad un processo di “ristrutturazione”.
Per entrare però meglio nella questione, dobbiamo fare prima una digressione su cosa sia un dato strutturato e un dato non strutturato.
Dati strutturati e dati non strutturati
I dati strutturati sono dati che hanno una forma prevedibile e organizzata, come ad esempio quelli presenti in un foglio di calcolo o in una tabella di un database relazionale. I dati non strutturati, invece, non hanno una forma predefinita e possono essere più difficili da gestire: un esempio sono quelli contenuti in un file di testo.(scritto in linguaggio naturale), ma anche i file grafici e più in generale i prodotti multimediali. Sono tutti dati che non possono essere ordinati in modo schematico e organizzato, perché mancano di caratteristiche organizzative comuni.
Ci sono diversi motivi per cui i dati strutturati, soprattutto nell’attività di data analysis, sono preferibili ai dati non strutturati:
- Facilità di analisi: i dati strutturati sono organizzati in modo tale da essere facilmente analizzati da strumenti di Business Intelligence e di analisi dei dati. Ciò significa che è possibile creare report e visualizzazioni dei dati in modo semplice e veloce;
- Integrazione dei dati: i dati strutturati possono essere facilmente integrati con altre fonti di dati, poiché hanno un formato comune e predefinito. Ciò consente di creare una solida base di dati per l’analisi;
- Scalabilità: i sistemi di gestione dei dati strutturati sono progettati per gestire grandi quantità di dati e possono scalare facilmente per soddisfare le esigenze crescenti;
- Sicurezza dei dati: i dati strutturati possono essere protetti e gestiti in modo più efficace rispetto ai dati non strutturati, poiché i sistemi di gestione dei dati strutturati forniscono funzionalità di sicurezza integrate come l’autorizzazione e l’autenticazione degli utenti;
- Facilità di utilizzo e gestione: i dati strutturati possono essere facilmente utilizzati e gestiti da persone con competenze tecniche diverse da quelle strettamente informatiche, poiché gli strumenti di Business Intelligence e di analisi dei dati sono generalmente intuitivi e facili da usare.
Tipologia di dati e data leak
I data leak rilevati in rete sono molto comunemente composti da dati non strutturati o semi strutturati, questo perché sono spesso il frutto di esfiltrazioni operate da sistemi informatici non adeguatamente protetti (ed i dati non strutturati sono più facilmente esposti in tal caso) oppure perché rappresentato il risultato dell’attività di web scraping effettuata con crawler automatici, che non hanno però la capacità di “ricostruire” la semantica associata al dato originale (data la vastità e la rilevanza della questione, l’argomento potrà essere eventualmente ulteriormente approfondito in un altro scritto).
Uno dei primi obiettivi, che si pone un “ricettatore” di dati illegittimamente detenuti è quello di trasformare un file da plain text ad un formato strutturato più agevolmente manipolabile (e quindi di maggior pregio, anche e soprattutto per finalità di lucro) come può essere un CSV (comma separated value): tale passaggio permetterà inoltre una più facile individuazione di dati corrotti e di duplicati (questo è il motivo per cui spesso è possibile notare che il file pulito ha dimensioni anche significativamente inferiori all’originale).
Dalla teoria alla pratica
Considerata la mole di dati che è necessario analizzare, è necessario l’uso di editor di testo professionali (come ad esempio EmEditor) capaci di leggere file composti facilmente da milioni di righe e dunque impossibili da aprire con applicativi come Notepad per limiti intrinseci dell’architettura software.
Dopo aver studiato la struttura interna dell’archivio di turno, si progetta l’automatizzazione delle varie fasi di “ripulitura” con l’ausilio di linguaggi di programmazione agili e potenti come Python che attraverso la manipolazione dei dati, consentono di effettuare operazioni come: estrazione del testo, ricerca ed eliminazione di record corrotti e di duplicati, individuazione di campi attributo ed assegnazione a colonne specifiche.
L’output finale potrà essere un file CSV che, tecnicamente, non è altro che un file di testo dove i campi (o attributi) vengono separati da caratteri speciali come la virgola (ma è anche possibile imbattersi caratteri o simboli diversi):
Nome,Cognome,Email
mario,rossi,mariorossi@email.com
andrea,bianchi,andreabianchi@email.com
luigi,verdi,luigiverdi@email.com
andrea,rossi,andrearossi@email.com
Copiando e incollando in un editor il testo precedente e salvandolo con estensione CSV, si otterrà automaticamente un file di dati strutturati, composto da campi (colonne) e record (righe).

I file CSV sono generalmente utilizzati per essere importati in un database ed hanno una struttura ben definita (strutturata), dando la possibilità di effettuare ricerche veloci e selettive (grazie all’indicizzazione dei dati) nei record.

Per automatizzare i vari passaggi dell’attività di ripulitura (passaggi che, è implicito, possono essere molto più numerosi di quelli qui rappresentati) in file di grandi dimensioni (genericamente nella trasformazione di dati non strutturati in dati strutturati, ma anche più specificamente nelle attività correlate alla diffusione di data leak) sono molto utilizzate suite specifiche quali Anaconda e la piattaforma Jupyter Notebook, strumenti dei quali i data scientist devono necessariamente avere una profonda conoscenza (assieme a linguaggi di programmazione come Python, e librerie specialistiche come Pandas).
Progettazione delle operazioni di trasformazione
I file di Twitter originariamente rilevati in rete avevano una dimensione di circa 52 GB, mentre dai nostri rilievi tale dimensione, dopo le operazioni di ripulitura, è scesa a 12 Gb.
La struttura di origine era del tipo seguente (ricordando che, essendo la nostra finalità di tipo divulgativo e volta ad aumentare il livello di consapevolezza degli utenti, non useremo mai dati reali):
Email: email@dominio1.com- Name: NomeUtente1- ScreenName: Screenname1- Followers: 0 - Created At: Sun Oct 10 17:00:00 +0000 2010
Email:email@dominio2.com - Name: NomeUtente2- ScreenName: Screenname2- Followers: 1 - Created At: Sun Oct 11 18:00:00+0000 2011
Email:email@dominio3.com- Name: NomeUtente3- ScreenName: Screenname3- Followers: 2 - Created At: Sun Oct 12 19:00:00+0000 2012
Email:email@dominio4.com- Name: NomeUtente4- ScreenName: Screenname4- Followers: 3 - Created At: Sun Oct 13 20:00:00+0000 2013
Email:email@dominio5.com- Name: NomeUtente5- ScreenName: Screenname5- Followers: 4 - Created At: Sun Oct 14 20:00:00+0000 2014
Come si può notare l’header non è esplicitato in una intestazione ma si può ricavare agevolmente, poiché in ogni riga si ripetono i nomi dei campi seguiti dai valori specifici del record (Email, Nome, ScreenName, Followers, CreatedAt). Anche le date, benché comprensibili, sono espresse in forma estesa ed in uno standard poco adatto ad una successiva attività di ricerca.
Lo schema applicato è in primo luogo volto a trovare un separatore adatto rappresentare le distinte colonne, per poi eliminare il testo che si ripete e, nel caso specifico, convertire le date in un formato più leggibile, per poi in ultimo rimuovere i duplicati.
Un ulteriore passaggio consiste poi nell’individuare caratteri eliminabili (non informativi) all’interno dei campi valore, estraendo solo il testo utile e recante significato specifico. Un esempio, come da immagine a seguire, è l’estrazione del campo email dal primo carattere successivo alla stringa “Email: ” fino al carattere “-” escluso.

I problemi non finiscono mai
Vi sono ovviamente innumerevoli difficoltà aggiuntive che si possono riscontrare nell’attività di analisi e manipolazione dei dati, spesso con criticità che si manifestano solo su record specifici e non su tutto l’insieme; è quindi chiaro che è sempre fondamentale una costante attività di controllo dei risultati attesi, onde poter correggere tempestivamente eventuali deviazioni rispetto all’output previsto.
Per maggior chiarezza, consideriamo ancora l’esempio precedente: nell’estrazione del testo tra “Email: ” e carattere “-“, se il campo email desiderato avesse contenuto a sua volta un carattere “-“, questo avrebbe generato un’anomalia nel parsing dell’intero record, con la conseguenza di un output incongruo al risultato atteso:
Email: mario-rossi@dominio.com- Name: Mario-Rossi-Bianchi- ScreenName: mariorossi- Followers: 0 - Created At: Sun Oct 10 17:00:00 +0000 2010
colonna_in_più_1 | colonna_in_più_2 | |
---|---|---|
mario | rossi | bianchi@dominio.com |
Allo stesso modo, se fosse stato utilizzato come separatore di campo il carattere “:” il campo relativo alla data sarebbe risultato spezzato e conseguentemente inintelligibile. La stringa “Created At: Sun Oct 10 17:00:00 +0000 2010” sarebbe infatti divisa come:
Created At | colonna_in_più_1 | colonna_in_più_2 | colonna_in_più_3 |
---|---|---|---|
Sun Oct 10 | 17 | 00 | 00 +0000 2010 |
E’ chiaro quindi come l’esperienza e la conoscenza tecnica dell’analista sia qui fondamentale per rilevare rapidamente specifiche casistiche e programmare perciò adeguatamente gli script di conversione.
Ulteriori passaggi
Sempre nel caso del nostro esempio, i probabili passaggi applicati potrebbero essere ricostruiti come segue: in primo luogo una volta analizzato il file d’origine sono stati creati campi dati idonei (colonne) utilizzando il carattere “:” come carattere separatore:

Vengono poi rinominati tali campi con la proprietà specifica che rappresentano:

Successivamente, si procede alla riconversione della data in un formato leggibile attraverso prima l’unione delle colonne (Created At, Data1, Data2) e poi la creazione di una nuova colonna Created_At con un formato standard di rappresentazione (YYYY-MM-DD):

Si puliscono poi i dati, eliminando le sottostringhe non informative, come “- Name”, “- ScreenName”, “- Followers”, “- Created At”:

Da ultimo, si rimuovono i record duplicati (spesso rilevabili solo al termine di tutte operazioni precedenti) e si esegue l’esportazione dei dati in un file dati strutturato quale ad esempio CSV.
