Codice per verificare Password con ML
Ecco una spiegazione riga per riga del codiceper 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.