Infinity-1995's picture
Update app.py
cbb2b12 verified
import gradio as gr
import pandas as pd
import random
from sklearn.ensemble import IsolationForest
# Global login history
login_history = []
# Simulate typing speed (chars/sec)
def simulate_typing_speed(normal=True):
return round(random.uniform(3.0, 6.0), 2) if normal else round(random.uniform(0.5, 2.5), 2)
# Simulate login attempt
def simulate_login(normal=True):
login_time = random.randint(8, 18) if normal else random.choice([0, 23])
actions = random.randint(5, 20) if normal else random.randint(25, 100)
typing_speed = simulate_typing_speed(normal)
# For demo: simulate device hash and IP
device = "device_1" if normal else random.choice(["device_2", "device_3"])
ip = "192.168.0.1" if normal else random.choice(["10.0.0.1", "172.16.0.1"])
return {"time": login_time, "actions": actions, "typing_speed": typing_speed, "device": device, "ip": ip}
# Risk scoring function
def evaluate_risk(new_login, history):
# Default matches
device_match = any(l["device"] == new_login["device"] for l in history)
ip_match = any(l["ip"] == new_login["ip"] for l in history)
# Anomaly detection only on numeric features
if len(history) >= 10:
df = pd.DataFrame(history + [new_login])
model = IsolationForest(contamination=0.1)
model.fit(df[["time", "actions", "typing_speed"]])
pred = model.predict(df[["time", "actions", "typing_speed"]])
is_anomaly = pred[-1] == -1
else:
is_anomaly = False # not enough data
# Risk logic
if not is_anomaly and device_match and ip_match:
risk = "Low Risk ✅"
color = "green"
elif is_anomaly and device_match and ip_match:
risk = "Medium Risk ⚠️"
color = "yellow"
else:
risk = "High Risk 🚨"
color = "red"
return risk, color
# Main function for Gradio
def login(action):
global login_history
new_login = simulate_login(normal=(action=="Normal Login"))
login_history.append(new_login)
risk, color = evaluate_risk(new_login, login_history)
# Convert history to DataFrame for display
df = pd.DataFrame(login_history)
df = df.rename(columns={"time":"Login Time","actions":"Actions","typing_speed":"Typing Speed","device":"Device","ip":"IP Address"})
return df, f"{risk}"
# Gradio interface
iface = gr.Interface(
fn=login,
inputs=gr.Radio(["Normal Login","Suspicious Login"], label="Select Login Type"),
outputs=[gr.Dataframe(headers=["Login Time","Actions","Typing Speed","Device","IP Address"]),
gr.Textbox(label="Risk Status")],
live=True,
title="🛡️ IdentityGuard AI",
description="AI-powered behavioral login monitoring with anomaly detection and risk scoring"
)
iface.launch()