-->

Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Password Assesment


Codice per verificare Password con Machine learning

Codice per verificare Password con ML

Ecco una spiegazione riga per riga del codice
per verificare una password con Machine learning


import pandas as pd


Importa la libreria pandas, che è utilizzata per la manipolazione e l'analisi di dati strutturati.
In questo caso, viene utilizzata per creare un **DataFrame** dal dataset di password.

 
from sklearn.model_selection import train_test_split
 
 
Importa la funzione `train_test_split` da `scikit-learn`, che suddivide il dataset in due parti: una per l'addestramento del modello e una per il test.


from sklearn.pipeline import Pipeline

Importa la classe `Pipeline`, che consente di unire più fasi di elaborazione (trasformazioni e classificazione) in un unico oggetto per semplificare il flusso di lavoro.


from sklearn.feature_extraction.text import TfidfVectorizer

Importa il `TfidfVectorizer`, uno strumento che trasforma un insieme di stringhe (in questo caso, password) in una rappresentazione numerica basata sulla frequenza dei termini e l'importanza relativa.
Viene utilizzato per convertire le password in una forma che il modello di machine learning possa utilizzare.


from xgboost import XGBClassifier

Importa `XGBClassifier`, che è un potente classificatore basato sull'algoritmo XGBoost.
Questo classificatore è particolarmente efficiente per la classificazione su grandi dataset ed è noto per le sue prestazioni elevate.


from sklearn.metrics import accuracy_score

Importa `accuracy_score`, una funzione utilizzata per calcolare l'accuratezza del modello confrontando le etichette previste (predizioni) con quelle reali.


from sklearn.model_selection import cross_val_score

Importa `cross_val_score`, che esegue una cross-validation, una tecnica per valutare la stabilità e la generalizzabilità di un modello di machine learning su più partizioni del dataset.
Vedi anche


data = {'password': ['12345', 'password', 'helloWorld123!', 'qwerty', 'Pa$$w0rd!', 'admin123', 
                     'letmein12345', 'R@ndomP@ssword2022', 'iloveyou', 'sunshine', '123abcABC!'],
        'is_secure': [0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1]}  # 0 = Non sicura, 1 = Sicura

- Qui viene creato un **dataset simulato** di password, dove le chiavi del dizionario sono `password` (la lista delle password) e `is_secure` (le etichette binarie: 0 indica una password non sicura, mentre 1 indica una password sicura). È un dataset di esempio, ma in un contesto reale verrebbero utilizzate password reali da un dataset pubblico come RockYou.


df = pd.DataFrame(data)

Converte il dizionario `data` in un DataFrame Pandas, che è una struttura dati tabellare molto utilizzata in Python per lavorare con dati etichettati.


X_train, X_test, y_train, y_test = train_test_split(df['password'], df['is_secure'], test_size=0.3, random_state=42)

Divide il dataset in due parti: un set di **addestramento** e un set di **test**. `X_train` e `X_test` contengono le password, mentre `y_train` e `y_test` contengono le etichette corrispondenti (sicura o non sicura). `test_size=0.3` indica che il 30% del dataset sarà utilizzato per il test, mentre il restante 70% sarà utilizzato per l'addestramento. `random_state=42` assicura che la divisione sia ripetibile.


pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),  # Trasforma le password in rappresentazioni numeriche
    ('xgb', XGBClassifier(eval_metric='logloss'))  # Classificatore XGBoost
])


  • Pipeline: Crea una pipeline di due fasi:
    • TfidfVectorizer trasforma le password in una rappresentazione numerica basata sulla loro frequenza.
    • XGBClassifier addestra un modello di classificazione basato sull'algoritmo XGBoost, utilizzando la metrica di valutazione `logloss`.


pipeline.fit(X_train, y_train)


Addestra la pipeline (che include il vettorizzatore TF-IDF e il modello XGBoost) utilizzando i dati di addestramento (`X_train`, le password, e `y_train`, le etichette).


y_pred = pipeline.predict(X_test)


Usa il modello addestrato per fare previsioni sulle password nel set di test (`X_test`), restituendo le previsioni `y_pred` (ossia se ogni password è considerata sicura o no).


print("Accuratezza del modello:", accuracy_score(y_test, y_pred))

Calcola l'accuratezza del modello confrontando le previsioni `y_pred` con le etichette reali `y_test`.
Stampa il risultato dell'accuratezza del modello, ossia la percentuale di password classificate correttamente.


def verifica_password(password):
    score = pipeline.predict([password])
    return "Sicura" if score == 1 else "Non sicura"

Definisce una funzione che consente di verificare la sicurezza di una singola password. Prende una password come input, la passa attraverso la pipeline (incluso il vettorizzatore TF-IDF e il modello XGBoost), e restituisce "Sicura" se il risultato della predizione è 1, altrimenti "Non sicura".


password_input = input("Inserisci la tua password: ")
print(f"La password '{password_input}' è {verifica_password(password_input)}.")

Chiede all'utente di inserire una password tramite input.
Usa la funzione `verifica_password` per determinare se la password è sicura o meno e stampa il risultato.


cross_val = cross_val_score(pipeline, df['password'], df['is_secure'], cv=3)

Esegue la **cross-validation utilizzando 3 fold (`cv=3`).
Questo divide il dataset in 3 partizioni, addestra il modello su 2 di esse e lo testa sulla terza, ripetendo il processo per tutte le partizioni. Questo aiuta a valutare le prestazioni del modello su diverse suddivisioni del dataset.
Per data set piu' grandi il numero puo' essere aumentato


print(f"Risultato cross-validation: {cross_val.mean()}")


Stampa la media dei punteggi della cross-validation, fornendo una misura della generalizzazione del modello su diversi sottogruppi del dataset.