Keystroke liveness detector

Detects whether free-text keystroke timing is from a real human or a machine-synthesized forgery (liveness, not identity verification).

  • Model: scikit-learn HistGradientBoosting, 24 aggregate timing features, trained on mixed-length login windows (length-agnostic).
  • Eval (subject-grouped split, no leakage): ROC-AUC 0.973, FAR 0.051, FRR 0.152; strongest attack (WithinSubjectAll) AUC 0.93 / FAR 0.11.
  • Bundle (liveness_detector.joblib) = {feature_columns, scaler, models:{HGB}, min_keys, metrics}.

Single-login accuracy is weaker than the aggregate AUC; intended as a supplementary risk signal, not a sole gate.

Data / license

Trained on the Mendeley Free-Text Keystroke Dynamics for Liveness Detection dataset (CC BY-NC 3.0). This derived model inherits non-commercial + attribution.

Load

import joblib, numpy as np
b = joblib.load("liveness_detector.joblib")
m, sc = b["models"]["HistGradientBoosting"], b["scaler"]
p = m.predict_proba(sc.transform(np.array(features)[None,:]))[0,1]  # P(synthetic)
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support