Security Tools

Secrets & PII Scrubber

Paste a log, stack trace or config file and mask personal data and credentials before you post it in a ticket, chat or AI prompt. Choose full redaction, partial masking, consistent pseudonyms or short hashes, and review every change in a highlighted diff.

Private by design: anything you enter is processed in your browser only. It is never uploaded to or logged on our servers. Share links contain only your detector and masking settings, never the text you paste.

Detectors

Optional LABEL = prefix. If the pattern has a capture group, only group 1 is masked.

Findings by type

TypeFoundUniqueMasked preview

Previews always use partial masking, so original values are never shown in this table. Detection is best-effort: read the output before you share it.

About scrubbing secrets and PII from logs

Logs, HAR files, crash reports and config dumps routinely contain things that should never leave your machine: customer email addresses and phone numbers, card numbers, session tokens, database URLs with embedded passwords and cloud access keys. Once that text is pasted into a ticket, a public issue, a chat channel or an AI assistant it is copied, indexed and retained by systems you do not control, and a leaked access key can be abused within minutes. This scrubber removes those values locally, before the text goes anywhere.

Each detector combines a pattern with a validation step to keep false positives down. Card numbers must have 13–19 digits and pass the Luhn checksum, IBANs must pass the ISO 13616 mod-97 check, IPv6 candidates are parsed group by group, and AWS secret keys are only matched when they follow a secret-style key name, because a bare 40-character Base64 string is indistinguishable from a hash. Phone detection is deliberately conservative: it matches international + numbers and separated North American formats, not every long run of digits, so order IDs and timestamps survive. When two detectors overlap, the more specific one wins (a JWT inside an Authorization header is reported as a JWT).

Pick the masking mode that fits the reader. Full redaction is the safest for public posts. Partial masking keeps the last four digits or the email domain so support staff can still match a record. Consistent pseudonyms replace each distinct value with a stable placeholder (EMAIL_1, IP_2), so you can still follow one user or host through a log without knowing who they are. Short hashes do the same across separate files, but an unsalted hash of a low-entropy value such as a phone number can be reversed by brute force, so treat it as pseudonymisation, not anonymisation.

Use it before attaching logs to bug reports, together with the log analyzer for spotting error spikes, or before sharing a HAR capture in the HAR viewer. To inspect a token you found rather than hide it, use the JWT decoder; to check whether a number is a real card or IBAN, use the credit card & IBAN validator; and for test fixtures that never contained real people in the first place, generate them with the mock data generator. Custom patterns can be tried out first in the regex tester.

Reference Guide

Built-in detectors, in priority order (all examples are fake):

DetectorWhat is matchedExample
Private key blocksFrom -----BEGIN … PRIVATE KEY----- to the matching END line (RSA, EC, OpenSSH, PKCS#8, PGP)-----BEGIN RSA PRIVATE KEY-----
URLs with credentialsuser:password between :// and @ in any schemepostgres://app:S3cret@db.internal/app
JWTThree Base64URL segments where header and payload start with eyJeyJhbGciOi….eyJzdWIiOi….sig
AWS access key IDAKIA (long-term) or ASIA (temporary) + 16 uppercase letters/digitsAKIAIOSFODNN7EXAMPLE
AWS secret access key40 Base64 characters, only after a key name containing secret and = or :aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
GitHub tokenghp_, gho_, ghu_, ghs_, ghr_ + 36 or more characters, or github_pat_ghp_ followed by 36 letters and digits
Slack tokenxoxb-, xoxa-, xoxp-, xoxr-, xoxs- followed by the token bodyxoxb-0000000000-FAKE…
Stripe keysk_, pk_ or rk_ + live_/test_ + key bodysk_test_FAKE…
Google API keyAIza + 35 charactersAIza + 35 letters, digits, - or _
Authorization headerToken after Bearer, or after Authorization: Basic/TokenAuthorization: Bearer abc123def456
Password / secret key-valueValue of keys ending in password, passwd, pwd, secret, token, api_key, access_key, client_secret… in key=value, key: value and JSON"password": "hunter2", DB_PASSWORD=changeme
Email addresslocal@domain.tldjane.doe@example.com
IBANCountry code, 2 check digits and 11–30 characters, with or without spaces; must pass mod-97GB82 WEST 1234 5698 7654 32
Credit card number13–19 digits (spaces or dashes allowed) starting with 2–6 and passing Luhn4111 1111 1111 1111
IPv4 / IPv6Dotted quads with octets 0–255; IPv6 with full or ::-compressed groups203.0.113.42, 2001:db8::8a2e:370:7334
Phone number+ country code with 8–15 digits in total, or (415) 555-0123 / 415-555-0123 / 415.555.0123+44 20 7946 0958

Masking modes:

ModeEmailCardReversible?
Full redaction[REDACTED:EMAIL][REDACTED:CREDIT_CARD]No
Partial maskj***@example.com**** **** **** 1111No, but keeps hints
PseudonymEMAIL_1CARD_1Only with the original text; numbering restarts per run
Short hash[EMAIL#5f1a…][CARD#9c3e…]Guessable for low-entropy values

Limitations. Regex detection is best-effort. It will miss names, postal addresses, national ID numbers, secrets with no recognisable prefix or key name, and values split across lines or encoded (Base64, URL-encoding). A random digit string can occasionally pass Luhn, and a version number can look like an IPv4 address. Always review the highlighted output before sharing, and rotate any credential that was exposed even briefly: scrubbing a copy does not un-leak the original.

Example input

2025-03-14T09:21:07Z INFO  login ok user=jane.doe@example.com ip=203.0.113.42
2025-03-14T09:21:09Z WARN  payment declined card=4111 1111 1111 1111 phone=+1 415 555 0123
2025-03-14T09:21:11Z DEBUG db connect postgres://app_user:S3cr3tPassw0rd@10.0.4.17:5432/orders
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
{"user":"carol","password":"hunter2","retry":3}

This sample loads automatically when you open the tool. Use Load Sample to bring it back.

Frequently Asked Questions

It finds and masks API keys, access tokens, JWTs, private keys, passwords in key-value pairs, email addresses, phone numbers, card numbers, IBANs and IP addresses, so logs and snippets can be shared safely.

No. Detection and masking run entirely in your browser, and the input is never included in share links.

Yes. Detection is pattern-based, so unusual secret formats can slip through. Always review the output before posting it, and rotate any credential that was exposed.