|
|
import streamlit as st |
|
|
import joblib |
|
|
import numpy as np |
|
|
import string |
|
|
|
|
|
|
|
|
pipeline = joblib.load("ensemble_pipeline.joblib") |
|
|
label_map = joblib.load("label_map.joblib") |
|
|
|
|
|
reverse_label_map = {v: k for k, v in label_map.items()} |
|
|
|
|
|
|
|
|
st.title("Password Strength Predictor") |
|
|
st.write(""" |
|
|
Enter a password below to see its predicted strength (Weak, Medium, or Strong) |
|
|
using a pre-trained ensemble classifier. |
|
|
""") |
|
|
|
|
|
|
|
|
password = st.text_input("Enter a Password:") |
|
|
|
|
|
|
|
|
def generate_numerical_features(pwd): |
|
|
return np.array([ |
|
|
len(pwd), |
|
|
sum(1 for char in pwd if char.islower()) / max(1, len(pwd)), |
|
|
sum(1 for char in pwd if char.isupper()) / max(1, len(pwd)), |
|
|
sum(1 for char in pwd if char.isdigit()) / max(1, len(pwd)), |
|
|
sum(1 for char in pwd if not char.isalnum()) / max(1, len(pwd)), |
|
|
int(any(char in string.punctuation for char in pwd)) |
|
|
]) |
|
|
|
|
|
|
|
|
if st.button("Predict Strength"): |
|
|
if password: |
|
|
|
|
|
pred_numeric = pipeline.predict([password]) |
|
|
|
|
|
pred_label = reverse_label_map.get(pred_numeric[0], "Unknown") |
|
|
st.success(f"Predicted Password Strength: **{pred_label}**") |
|
|
else: |
|
|
st.warning("Please enter a password to get a prediction.") |
|
|
|