{"id":21001151,"url":"https://github.com/jabedude/ja3-rs","last_synced_at":"2025-05-14T23:32:29.929Z","repository":{"id":62441234,"uuid":"253541472","full_name":"jabedude/ja3-rs","owner":"jabedude","description":"JA3 Hash library written in Rust","archived":false,"fork":false,"pushed_at":"2023-11-26T21:16:23.000Z","size":18408,"stargazers_count":42,"open_issues_count":3,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-17T20:11:58.642Z","etag":null,"topics":["ja3","network-analysis","rust","ssl","tls"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jabedude.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-06T15:37:36.000Z","updated_at":"2025-04-17T05:53:59.000Z","dependencies_parsed_at":"2022-11-01T22:15:22.884Z","dependency_job_id":null,"html_url":"https://github.com/jabedude/ja3-rs","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabedude%2Fja3-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabedude%2Fja3-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabedude%2Fja3-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabedude%2Fja3-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jabedude","download_url":"https://codeload.github.com/jabedude/ja3-rs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254248400,"owners_count":22039007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ja3","network-analysis","rust","ssl","tls"],"created_at":"2024-11-19T08:13:56.497Z","updated_at":"2025-05-14T23:32:24.869Z","avatar_url":"https://github.com/jabedude.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ja3-rs\n\n[![crates.io](https://img.shields.io/crates/v/ja3.svg)](https://crates.io/crates/ja3)\n[![Build Status](https://travis-ci.org/jabedude/ja3-rs.svg?branch=master)](https://travis-ci.org/jabedude/ja3-rs)\n[![Documentation](https://docs.rs/ja3/badge.svg)](https://docs.rs/ja3/)\n[![license](https://img.shields.io/badge/license-BSD3.0-blue.svg)](https://github.com/jabedude/ja3-rs/LICENSE)\n\nA small JA3 TLS fingerprinting library written in Rust.\n\nThis crate enables a consumer to fingerprint the ClientHello portion of a TLS handshake.\nIt can hash TLS handshakes over IPv4 and IPv6. It heavily depends on the [tls-parser\nproject](https://github.com/rusticata/tls-parser) from Rusticata.\n\nIt supports generating fingerprints from packet capture files as well as live-captures \non a network interface, both using libpcap.\n\nSee the original [JA3 project](https://github.com/salesforce/ja3) for more information.\n\nExample of fingerprinting a packet capture file:\n\n```rust\nuse ja3::Ja3;\n\nlet mut ja3 = Ja3::new(\"test.pcap\")\n                    .process_pcap()\n                    .unwrap();\n\n// Now we have a Vec of Ja3Hash objects\nfor hash in ja3 {\n    println!(\"{}\", hash);\n}\n```\n\nExample of fingerprinting a live capture:\n\n```rust\nuse ja3::Ja3;\n\nlet mut ja3 = Ja3::new(\"eth0\")\n                    .process_live()\n                    .unwrap();\nwhile let Some(hash) = ja3.next() {\n    println!(\"Hash: {}\", hash);\n}\n\n```\n\n## Benchmarks\n\n| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |\n|:---|---:|---:|---:|---:|\n| `ja3 huge-cap.pcap` | 153.2 ± 2.3 | 149.8 | 157.2 | 34.85 ± 2.82 |\n| `./target/release/examples/ja3 huge-cap.pcap` | 4.4 ± 0.3 | 3.6 | 5.5 | 1.00 |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjabedude%2Fja3-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjabedude%2Fja3-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjabedude%2Fja3-rs/lists"}